ASM hazır kütüphane çalışmaları

Başlatan alikeskinkilic, 27 Ocak 2023, 00:44:06

alikeskinkilic

  ;////////////////////PAUSEUS///////////////////////////////////////////////
 ;/////////////////////////////////////////////////////////////////////////

;istenen gecikme için T1 makine adım sayısını verir formul
;örneğin OSC 8000000 için 10 us gecikme 20 makine adımı değerini verir
;bu adımları decfsz ile sayıyoruz ama her sorgulama için 1 goto komutu kullanılmalı
;oda 2 makine adımı demek yani her çevrim 3 makine adımı harcar.
;decfsz de son adımında 2 makine adımı yer
;tabi bulduğumuz değeri değişkenlere yazmak için da en az 2 adım harcarız(1 byte aşmıyorsa değer)
;bu adımları çevrim değişkenlerine yazmadan önce düşmemiz gerekir.
    
    DELAYUS MACRO US

    LOCAL T1,T2,T3,T4,FOSC
    FOSC=OSC/4000000 ;osc /4 /1000000 mikrosaniye öşçümü için 1/1000000  ms için 1/1000
    T1 = (US*FOSC)        ;girdiğimiz us değerinde kaç CYCLE SAYISI gerektiği burada çıkacak    
    T2 = T1-1        ; 
    T3 = T2/3
    T4 = T2%3        ; KALAN VARSA NOP İLE TAMAMLA
    IF T3<257 
    MOVLW T3
    MOVWF _TMP0
    DECFSZ _TMP0
    GOTO $-1
     IF T4==2
     NOP
     NOP
     ENDIF
     IF T4==1
     NOP
     ENDIF
    ELSE
    T2=T1-7
    T3=T2/3
    T4=T2%3
    T3=T3-HIGH(T3)/2
    MOVLW HIGH (T3)+1
    MOVWF    _TMP1
    MOVLW LOW (T3)
    MOVWF _TMP0
    DECFSZ _TMP0
    GOTO  $-1
    DECFSZ _TMP1
    GOTO  $-3
    IF T4==2
    NOP
    NOP
    ENDIF
    IF T4==1
    NOP
    ENDIF
    ENDIF
    ENDM
mikrosaniye bekleme için bir makro yazmaya çalışıyorum 1 byte sınırını aşmadığı sürece sorun yok fişek gibi çalışıyor sorun artık tek byte yetmediğinde (cycle-1)/3>256 olduğunda iç içe döngü algoritmasını sorunsuz gecikmede kayma olmadan yakalayamıyorum şu meşhur pic delay programında nasıl bir formül kullanmışlarsa bana ondan lazım.Sorunum şu ki adım sayısı 257 olduğunda üst byte 1 oluyor yani decfsz de geçersiz elaman gibi nop ile aynı direkt atlıyor o yüzden üst byte 1 ekliyorum ki o da sayıma dahil olsun ama alt byte her 0 olduğunda cüzi de olsa kayma yapıyor ve tam o iki aralıkta zaman sapıtıyor. dedim yapay zeka yapsın gpt ilk bi uğraştı sonra bıktı hatalardan dediki çok karışık xc.h kütüphanesi kullan beni yorma. Bende matematik 4 işlemden 3 ü yok ! 2 byte için formülü çıkarana baklava alacam  :)
Hep meraktan

Epsilon

DELAYUS MACRO US
    LOCAL T1, T2, T3, T4, FOSC, LOOP_1, LOOP_2
 
    FOSC = OSC / 4000000        ; 1 MHz internal cycle için çarpan (Örn: 8MHz için 2)
    T1 = (US * FOSC)            ; Toplam gereken makine adımı (Cycle)

    ; --- TEK BYTE DÖNGÜSÜ (Gereken cycle 768'den küçükse) ---
    IF T1 < 769
        ; Formül: T1 = 2 (Yükleme) + (T3 * 3) + 1 (Son adım bonusu) + T4 (Kalan)
        ; Buradan: T3 = (T1 - 3) / 3
        T2 = T1 - 3
        T3 = T2 / 3
        T4 = T2 % 3

        IF T3 > 0
            MOVLW   T3
            MOVWF   _TMP0
LOOP_1:     DECFSZ  _TMP0, F
            GOTO    LOOP_1
        ENDIF
        
        ; Kalan adımları NOP ile tamamlama
        IF T4 == 2
            NOP
            NOP
        ENDIF
        IF T4 == 1
            NOP
        ENDIF

    ; --- ÇİFT BYTE DÖNGÜSÜ (Gereken cycle 768 ve daha büyükse) ---
    ELSE
        ; İç içe döngüde dış döngü her döndüğünde iç döngü 256 kere döner.
        ; Sabit harcanan süreler düşüldükten sonra toplam cycle formülüze edilir.
        T2 = T1 - 5             ; Kurulum ve çıkış adımları düşülür
        T3 = T2 / 768           ; Yüksek bayt (Dış döngü sayaç değeri)
        T4 = T2 % 768           ; Kalan adımlar

        ; İç döngünün tam turları için dış döngü ayarı
        MOVLW   T3
        MOVWF   _TMP1
        MOVLW   0               ; İç döngü 256 tur atsın diye 0 yüklüyoruz
        MOVWF   _TMP0
LOOP_2:     DECFSZ  _TMP0, F
            GOTO    LOOP_2
            DECFSZ  _TMP1, F
            GOTO    LOOP_2 + 2  ; İç döngüyü tekrar 256 yapmadan direkt azaltmaya gider

        ; Çift bayttan kalan ekstra adımları temizleme döngüsü (Kalan T4 adımı için)
        T3 = T4 / 3
        T4 = T4 % 3
        IF T3 > 0
            MOVLW   T3
            MOVWF   _TMP0
_DELAY_REM: DECFSZ  _TMP0, F
            GOTO    _DELAY_REM
        ENDIF
        
        ; Son kalan 1 veya 2 adımı NOP ile besleme
        IF T4 == 2
            NOP
            NOP
        ENDIF
        IF T4 == 1
            NOP
        ENDIF
    ENDIF
    ENDM
Bunu denermisin

alikeskinkilic

#47
hocam yok 1 byte de de kayma yaptı 2 byte kaymadan ziyade tamamen farklı gecikme süreleri verdi.3. döngünün amacını anlamadım normalde cycle= (3*(r1+1))+(r2+256) .... gibi bişey olmalı 8mhz frekans ile 500us beklemeye registerlere r1=75 r2=2 veriyor pic delay programı sonuç net tutuyor 500us 1000 cycle  her geri sayım 3 makine adımı atıyor son adımda 1 fazla adımlıyor bu yuzden registere 1 eksik veriyoruz ki eksik olanı nop ile tamamlarız ama fazlaya çözüm yok yani 75 =0 olunca ikinci çevrimden dolayı artık 256 adım atacaktır. yani ((75*3)+1)+ ((3*256)+1)+(register yükleme ıvır zıvır sayısı) 995 + ıvır zıvır işte ben o ıvır zıvırın her durumda aynı olmasını sağlayamadım tum 255-0 geçişleri sorun yaratıyor yoksa 50000us de 1-2 us kayna hepi topu da kafa durunca inat da ettim. adam bunu 8 byte için yazmış hata yapmıyor programı

Hep meraktan

slimandheavy

bu paylaşımı Github'ta yapsanız günümüz itibari ile daha modern şekilde ilerleyebilir konu.

alikeskinkilic

Alıntı yapılan: slimandheavy - 01 Haziran 2026, 10:48:28bu paylaşımı Github'ta yapsanız günümüz itibari ile daha modern şekilde ilerleyebilir konu.
:D " ASM " Dilin kendisinden anlaşılmıyormu modern biri olmadığım. forumda aksakallılara haber saldım ihtiyar heyeti toplanıp bakar bi ara
Hep meraktan

power20


mehmet

Onlar, atlarına binip yavaşça uzaklaştılar.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

Benzer Konular (2)