Pic Assembly Gecikme Yardım

Başlatan GamzeDemir, 17 Mart 2008, 15:06:41

GamzeDemir

Merhaba Arkadaslar

Ben assembly den pek anlamam ama su an asm ile yazılmıs bi programa gecikme vermem lazım ama gecikme komutu diye bişey yok sanırım Embarassed Yani bi bakabilirmisin burada ki gecikme ayarı ne ile yapılmıs nereyi değiştirirsem istediğim kadar gecikme elde edebilirim lütfen yardım edin

Alıntı YapLIST P=16F84A
; C=80
; N=0
; R=DEC
INCLUDE "P16F84A.INC"



;* BIT CONST
C EQU 0
Z EQU 2
W EQU 0
F EQU 1
RP0 EQU 5
TOIF EQU 2
TOIE EQU 5
GIE EQU 7
RD EQU 0
WR EQU 1
EEIF EQU 4
;* USERS REG
TMR_SUR EQU D'12' ;
KLV_BRK_TMR EQU D'13' ;
TEST EQU D'14' ;
SON_TEMP EQU D'36' ;25

TON_D0 EQU 0 ;PORTB
TON_D1 EQU 1 ;PORTB
TON_D2 EQU 2 ;PORTB
TON_D3 EQU 3 ;PORTB
TON_EA EQU 4 ;PORTB
TX_OUT EQU 5 ;PORTB

TUS1 EQU 2 ;PORTA
TUS2 EQU 3 ;PORTA

TX_ON_LED EQU 0 ;PORTA
TX_OFF_LED EQU 1 ;PORTA

DTMF_ON_SUR EQU D'200' ;CONSTANT
DTMF_OFF_SUR EQU D'100' ;CONSTANT
INT_SUR EQU D'227' ;CONSTANT

DTMF_SIFIR EQU 00101010B
DTMF_BIR EQU 00100001B
DTMF_IKI EQU 00100010B
DTMF_UC EQU 00100011B
DTMF_DORT EQU 00100100B
DTMF_BES EQU 00100101B
DTMF_ALTI EQU 00100110B
DTMF_YEDI EQU 00100111B
DTMF_SEKIZ EQU 00101000B
DTMF_DOKUZ EQU 00101001B
DTMF_YILDIZ EQU 00101011B
DTMF_DIYEZ EQU 00101100B
DTMF_A EQU 00101101B
DTMF_B EQU 00101110B
DTMF_C EQU 00101111B
DTMF_D EQU 00100000B
;***********************************************************

ORG 00
GOTO START
ORG 04
INT;
MOVLW INT_SUR
MOVWF TMR0
BSF TEST,C ;992 uSN

BCF INTCON,TOIF
RETFIE


;*****************************************;
; START ROUTINE *;
;*****************************************;
START;
MOVLW B'00000000'
MOVWF PORTA

MOVLW B'00000000'
MOVWF PORTB


BSF STATUS,RP0
MOVLW B'11111100'
MOVWF TRISA
MOVLW B'11000000'
MOVWF TRISB
MOVLW B'00000100' ;1/32
MOVWF OPTION_REG
BCF STATUS,RP0

CLRF PORTA
CLRF PORTB

CLRF TMR0
BCF INTCON,TOIF ;TIMER INT ENABLE
BSF INTCON,TOIE
BSF INTCON,GIE

TUS_BIRAK:
MOVLW D'20'
CALL DELAY
NOP
BTFSS PORTA,TUS1
GOTO TUS_BIRAK
BTFSS PORTA,TUS2
GOTO TUS_BIRAK
MOVLW D'20'
CALL DELAY
BTFSS PORTA,TUS1
GOTO TUS_BIRAK
BTFSS PORTA,TUS2
GOTO TUS_BIRAK
KLV_TARA;
BTFSS PORTA,TUS1
GOTO TUS1_BAK
NOP
NOP
NOP
NOP
NOP
BTFSS PORTA,TUS2
GOTO TUS2_BAK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
GOTO KLV_TARA

TUS1_BAK;
BTFSC PORTA,TX_ON_LED
GOTO TUS_BIRAK

BSF PORTB,TX_OUT
BSF PORTA,TX_ON_LED

CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF

MOVLW DTMF_YILDIZ
CALL DTMF_ON
CALL DTMF_OFF

MOVLW DTMF_SIFIR
CALL DTMF_ON
CALL DTMF_OFF

MOVLW DTMF_BIR
CALL DTMF_ON
CALL DTMF_OFF



GOTO TUS_BIRAK


TUS2_BAK;
BTFSS PORTA,TX_ON_LED
GOTO TUS_BIRAK

BCF PORTA,TX_ON_LED
BSF PORTB,TX_OUT
BSF PORTA,TX_OFF_LED

MOVLW DTMF_YILDIZ
CALL DTMF_ON
CALL DTMF_OFF

MOVLW DTMF_DIYEZ
CALL DTMF_ON
CALL DTMF_OFF

CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF


MOVLW DTMF_YILDIZ
CALL DTMF_ON
CALL DTMF_OFF

MOVLW DTMF_DIYEZ
CALL DTMF_ON
CALL DTMF_OFF

CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF
CALL DTMF_OFF

MOVLW DTMF_YILDIZ
CALL DTMF_ON
CALL DTMF_OFF

MOVLW DTMF_DIYEZ
CALL DTMF_ON
CALL DTMF_OFF

BCF PORTB,TX_OUT
BCF PORTA,TX_OFF_LED

GOTO TUS_BIRAK

DTMF_ON;
MOVWF PORTB
NOP
NOP
BSF PORTB,TON_EA

MOVLW DTMF_ON_SUR
CALL DELAY
BCF PORTB,TON_EA
RETURN

DTMF_OFF;
MOVLW DTMF_OFF_SUR
DELAY;
MOVWF TMR_SUR
DELAY_1;
BCF TEST,C
DELAY_2;
BTFSS TEST,C
GOTO DELAY_2

DECFSZ TMR_SUR,F
GOTO DELAY_1
RETURN

END


Sanırım gecikme kısmı surası

Alıntı YapDELAY;
MOVWF TMR_SUR
DELAY_1;
BCF TEST,C
DELAY_2;
BTFSS TEST,C
GOTO DELAY_2

DECFSZ TMR_SUR,F
GOTO DELAY_1
RETURN

Mesela ben CALL DELAY desem ne kadarlık gecikme saglamıs olurum bi fikri olan var mı   :cry:   :(

mucitotomasyon

asm de
gecikme  programı dedigin yer gecikmesinin basit bir hesabı var
internet te  bakarsan  bir cok kaynak bulursun bi zaman lar biliyodum asm bırakınca unttum

pioneer5900

dostum bu gecikme biraz yanlış gibi geldi bana bak bu döngü 1sn lik gecikme yapıyor.
GECIKME        
 MOVLW  D'2'    
 MOVWF  SAYAC1    
DON1        
 MOVLW  D'200'    
 MOVWF  SAYAC2    
DON2        
 MOVLW  D'250'    
 MOVWF  SAYAC3    
DON3        
 
DECFSZ  SAYAC3,F    
 GOTO  DON3    
 DECFSZ  SAYAC2,F    
 GOTO  DON2    
 DECFSZ  SAYAC1,F    
 GOTO  DON1    
RETURN        

CALL   GECIKME yazarsan sayac1,sayac2,sayac3 e bağlı olarak bunların çarpımı olan 2*200*250=100000 adet makine saykılı gecikme olmuş oluyor buda 4 MHZ dış osilatörü olan bir pic için 1/4=1MHZ frekans ile
bir saykıl 1\1mhz=1usn oluyor.bunuda döngü sayısıyla çarparsan 1 sn gecikme sağlamış oluyorsun.(aslında call ve return komutu ilede 4 saykıl harcanıyor yani tam döngün 100004 oluyor 4saykıl ise 4usn lik bir gecikme sağlar .bunun için 250 yerine 249 yazarsan tam denk gelir.
Zorsa yaparız imkansız ise zaman alır....

pioneer5900

bu 249 meselesini yanlış hesapladık.. bu arada bayan olduğunuza dikkat etmedim kuusra bakmayınız kolay gelsin.
Zorsa yaparız imkansız ise zaman alır....

GamzeDemir

Alıntı yapılan: "pioneer5900"bu 249 meselesini yanlış hesapladık.. bu arada bayan olduğunuza dikkat etmedim kuusra bakmayınız kolay gelsin.

Rica ederim sorun değil sağol un yardımlarınız için gercekten çok yardımcı oldunuz inanın ;)

pioneer5900

bu arada birşeyi söylemeyi unuttuk sayac1,sayac2,sayac3 değişkenleri bir hafıza adresini göstermesi gerekiyor.pogramın başına eklenmeli
sayac1   equ   0x10
sayac2   equ   0x11
sayac3   equ   0x12

kolay gelsin.
Zorsa yaparız imkansız ise zaman alır....

kostebek

Alıntı yapılan: "pioneer5900"bu arada birşeyi söylemeyi unuttuk sayac1,sayac2,sayac3 değişkenleri bir hafıza adresini göstermesi gerekiyor.pogramın başına eklenmeli
sayac1   equ   0x10
sayac2   equ   0x11
sayac3   equ   0x12

kolay gelsin.

0x10 dan başlarsa çoğu pic de çalışmaz çok kullanılan 877 ve 628 için h'20' ideal ;)

pioneer5900

örnek olsun diye yazmıştım pic ten hiç anlamam yazmışsın o yüzden ..bilgi için teşekkürler..
Zorsa yaparız imkansız ise zaman alır....