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

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

alikeskinkilic

virgülden sonrasını çarpmamın sebebi örneğin proton kütüphanesi 32 bit tutuyorya sayıyı bunun yerine 3,5 için 2 byte tutsa zaten virgüllü sayı kullanılması durumunda ayrılan ram bölgesi farklı atanmış yani eğer virgüllü sayı kullanılırsa hep ayrılmış ram bölgelerine kaydediliyor gene aynı mantıkla 0,5 için 0000 0101 şeklinde yada kütüphanede olduğu şekli ile alt 23 biti içerisinde 5 sayısını tutsa tam sayıdan farklı şekilde işlem görüyor zaten kütüphane içinde de .şunu denedim acaba bu formatta 32 bitlik bir sayının ardına ondalık bir sayıyı kabul ediyormu diye etmiyor taşıyor  yani ondalık ile tam sayı arasında ödünleşme var tam sayı ne kadar büyükse ondalık kısmı o kadar küçülmek zorunda aynı şekilde tersi de geçerli  bir farkı yokki o zaman
Hep meraktan

muuzoo

#16
Alıntı yapılan: alikeskinkilic - 30 Ocak 2023, 15:17:54"Fakat noktadan sonra 8-7 hane devam ediyorsa ne olacak o zaman." işte bende onu anlamıyorum hocam diyelim 3.000001 sayısının karşılığı ıeee standardında hata payıyla çıkıyor zaten şöyle bir sayıya denk geliyor ram da tutulan bilgi  "3.00000095367431640625" zaten kendinden hatalı format onun yerine  3.000001 sayısını 1 000 000 sayısı ile çarpınca sonuçta 3000001 sayısı çıkıyor üstelikte hata yok ve 32 bit uzunlukta da değil.herşeyi geçtim gene 32 bit yer kaplasın tamam benim dediğim mantıkla hata almadan kayan nokta alınabilirken ve komut sayısı bakımından da yarı yarıya fark varken.neden avantajını merak ediyorum sadece  dönşümler bu sitede yapılmıştır https://float.exposed/0x40400004

IEEE754 örneklerine bakarsan neden böyle bir gösterime ihtiyaç duyulmuş kavrarsın. Çok büyük ve küçük sayıları -ki bazı gösterimlerde bir miktar hata olacaktır- sabit uzunlukta (32 Bit) ifade etmeni sağlar. Ondalık kısmı her zaman 23 bitle ifade edilir boyutu değişmez, tam sayı kısmı ise 8 bit ile fiade edilir o da değişmez ve son olarak da 1 bit işaret içerir. Bu gösterim ile sınırlı bir alanda -32 bit- mümkün olduğunca çok değeri gösterebilmek istiyorsun bu yüzden bazı değerlerde hata kaçınılmaz olacaktır, fakat çoğu durumda kabul edilebilir seviyededir.

Örneğin Float32 nin temsil aralığı şu şekilde -3.4028234664 × 10^38 ile +3.4028234664 × 10^38 Bu büyüklükte sayıları bahsettiğiniz yöntemle kaydetmeye kalksaydık ne olurdu?

Peki her işlemde genişletmek için kullanılacak katsaysyı nasıl seçeçceksin ? Bir yerde 1M yeterken başka bir yerde başka bir katsayı kullandığında ne olacak?
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

yas

#17
Alıntı yapılan: alikeskinkilic - 30 Ocak 2023, 15:54:13virgülden sonrasını çarpmamın sebebi örneğin proton kütüphanesi 32 bit tutuyorya sayıyı bunun yerine 3,5 için 2 byte tutsa zaten virgüllü sayı kullanılması durumunda ayrılan ram bölgesi farklı atanmış yani eğer virgüllü sayı kullanılırsa hep ayrılmış ram bölgelerine kaydediliyor gene aynı mantıkla 0,5 için 0000 0101 şeklinde yada kütüphanede olduğu şekli ile alt 23 biti içerisinde 5 sayısını tutsa tam sayıdan farklı şekilde işlem görüyor zaten kütüphane içinde de .şunu denedim acaba bu formatta 32 bitlik bir sayının ardına ondalık bir sayıyı kabul ediyormu diye etmiyor taşıyor  yani ondalık ile tam sayı arasında ödünleşme var tam sayı ne kadar büyükse ondalık kısmı o kadar küçülmek zorunda aynı şekilde tersi de geçerli  bir farkı yokki o zaman

İyi de o zaman Long, Dword değişken tiplerini kullanırsın. Kayar noktalı değişken olmasının bir anlamı yok ki. Bu derleyicilere has bir şey değil. Microchip kendi çiplerinde kendi floating point standardını oluşturduğu için ona uyulması gerektiği için kullanılmış. Sizin tarif ettiğiniz yöntemde noktanın kayması gibi bir durum söz konusu değil. Yani tam sayı olmayan kısım sabit bir uzunluk, tam sayı başka bir kısımda. Buda doğrudan çözünürlüğü etkiliyor. Yani pi sayısını 3.14159265359 gibi işleme varken 3.14 olarak işlemek oluyor. Yada 1234 sayısının karekökten çıkartırken 111,1080555135405 yerine 111,1'i tercih etmek oluyor. Kayar noktalı yapıyı daha iyi anlamak için Link deki örnekleri inceleyin.

alikeskinkilic

Tamamdır hocam teşekkürler anladım olayı . Şu kısmı hala saçma geliyor o başka Bu büyüklükleri dandik bir 16 serisinde ne diye kullanırlar orası ayrı tabi.neyse uğraşıcaz bi şekilde çözmeye
Hep meraktan

yas

O zaman dikkat etmen gereken bir noktaya daha parmak basmak gerekli. Bilgisayarımız da kullandığımız işlemcilerin floating işleme standardı IEEE754 dür. Fakat microchip in kullandığı formatın mantığı aynı olmasına rağmen bit sıralamarında bazı değişikler mevcuttur (hangi sivri zekalıdan çıktıysa bu fikir tepesi deline tez vakitte). Floting point donanıma sahip mcu lar için kod üretirken buna dikkat etmek gerekir. Ayrıca 24bit, 32bit ve 64bit formatlarında olduğu unutulmamalı.

yas

#20
Alıntı yapılan: alikeskinkilic - 30 Ocak 2023, 22:22:59... Şu kısmı hala saçma geliyor o başka Bu büyüklükleri dandik bir 16 serisinde ne diye kullanırlar orası ayrı tabi.neyse uğraşıcaz bi şekilde çözmeye

Aslında zaman zaman ihtiyaç olabiliyor. Mesela bazı enerji analizörlerinde registerlar kayar noktalı olarak saklanıyor. Modbus üzerinde bu veriyi okuyup işlemek istediğinde o zaman bu dönüşüme ihtiyaç oluyor. Proton bunu 12f serisi için bile yapıyor. Ne gerek var diyebilirsiniz. Ama insanları anlamak mümkün olmuyor bazen. Burası dışında bir forumda ardunio donanımla yaptığı bir işi 20 yıl öncesine ait teknolojiye sahip pic12f675 yapmaya çalışıp derleyiciler buna da destek versin diye  oflayan puflayan insanlar var.

alikeskinkilic

#21
size güzel bir tüyo daha vereyim program başında "radix dec" velya    "list r=dec " ifadesi ile program içerisinde vereceğimiz değerlerde şu tarz oynamalar yapabiliriz
BASLA:
    CLRF        STATUS
    MOVLW    -8*11
    MOVWF    SAYI
    MOVLW    (28<<2)-42
    MOVWF    KERE
    ADDWF    SAYI    ,W  ;TOPLAMA SONUCUNU 0XEE(-18) ŞEKLİNDE BULUR
sonucunu 8 bit için doğru verir yani SAYI= 0xA8 yani -88 KERE =0x46 yani 70 olur.işe yarar kısmı negatif sayı verirken comf yapmak zorunda kalmazssınız işlemleri de hatasız yapar.radix dec belirtilmezse hex sayı üzerinden de aynı işlemler yapılır anlaması zor olur ve negatif sayıları karıştırır sadece
Hep meraktan

alikeskinkilic

#22
32 Bit işaretli sayıları paket halinde değişkenlere yazmak için  makro yazılan değer 2.147.483.647 ile -2.147.483.648 arası olabilir .
#include p16F690.inc
RADIX    DEC                  :desimal sayılar ile işlem yapabilmek için gerekli
CBLOCK 0x20
Out0 :5 ;res 1 ; 
 
ENDC
PAKET32 MACRO Var, Address ;Address meblab ide için Cblock yada udata kullanıldığında ram başlangıç adresidir(otm)
BANKSEL Address 
movlw Address 
movwf FSR                  ;fsr ye adresi yükler
movlw Var & H'FF'          ;en değersiz byte filtrelenip yazılır
movwf INDF                ;fsr nin işaretlediği adrese değeri yazar
movlw Var >>8 & H'FF'      ; Var 8 bit kaydırılır filtrelenip fsr 1 arttırılır(bir sonraki ram bölgesi yazılır)
incf FSR,F 
movwf INDF 
movlw Var >>16 & H'FF'
incf FSR,F 
movwf INDF 
movlw Var >>24 & H'FF'
incf FSR,F 
movwf INDF 
 
ENDM 
ORG 0
START 
PAKET32 12345678,Out0 ; PAKET32 -12345678,Out0 yazıldığında da negatif değeri yazabilir adreslere
 
goto START
END
Hep meraktan

RaMu

  @alikeskinkilic neden asm ile derinlemesine uğraşıyorsun? Yanlış anlama bende asm temelliyim, ağır ticari projelerde yaptım (yakın zamanda)
  Temel asm bilmenin ve programlama dillerinin nasıl geliştiğini bilmenin bir yazılımcı için zorunlu olması gerektiğini düşünüyorum ama
çokta asm üzerine yoğunlaşmamak lazım çok kısır bir kullanım alanı var, bunun yerine
sürdürülebilir, geliştirilebilir, ekip olarak rahatlıkla beraber çalışılabilir, kolay anlaşılabilir belli formatlı, üç ay üç yıl sonra bakılınca anlaşılabilir, başka kişilerinde sonradan dahil olabileceği insana daha yakın dilleri ortamları kullanmak daha faydalı.
Artık mcu programlamak için C dahi yetmiyor ve çok iyi işler için Matlab, Simulink, Embedded Coder ile model tabanlı tasarım yapıp hazır kod üreticiler ile kod üretiliyor, test ediliyor, revize edilip hatalar gideriliyor, sonradan rahatlıkla ekleme çıkarma yapılabiliyor kolaylıkla geliştirme gerçekleştirme yapılıyor.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

alikeskinkilic

Cevap Seviyorum.ayrıca kısır kullanım alanı olduğu gerçek değil çünkü kodu c le uçarcasına yazsanız da c yi geliştirenlerin ASM yazma becerisi kadar iyi olabilirsiniz fazlası değil.şöyle düşünebilirsiniz parlement alacak param var ama ben sigaramı kendim sararak içmeyi seviyorum .paylaşımları da ilgisini çeken biri belki faydalanır diye yapıyorum.
Hep meraktan

RaMu

  Seviyorsan güzel, takıntı olmasın yeter. Konuyu tartışmaya çevirme niyetim yok çünkü aynı kısır tartışmaları bende zamanında yaptım, asm candır gerisi heyecandır kıvamına geliyordum,
1960 ta kalmaya gerek yok. Kısaca sigara içmek zevkli ama zararlı ne içtiğinin önemi yok, önemli olan sigara satmak.

Bende eski asm algoritma çalışmalarımdan birini ekleyeyim hex to BCD dönüştürücü:
Asm hali https://www.picproje.org/index.php/topic,52348.msg396670.html#msg396670
C karşılığı
https://www.picproje.org/index.php/topic,54453.msg416052.html#msg416052

Buda denediğim birşey forumdada paylaşmışımdır, umarım sende asmden bir önceki adıma inmezsin.
http://danamlund.dk/pic_microcontroller_blinking_led_without_cheating.html
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

alikeskinkilic

saygı duyarım ,tartışmayı da isterim de burada değil bir başlık açın diller arasında artısı eksisi tartışırız faydalı da olur ama burada başlık ASM birşeyler paylaşıyorum yani ASM öğrenmek isteyenler için konu faydasız yerlere gider.bırakın konu ile ilgili paylaşımlar yapılsın lütfen
Hep meraktan

alikeskinkilic

EEPROM yazma ve okuma makrosu
;/////////////////////////////////////////////////////////////////    
    ;EEPROM YAZMA
;/////////////////////////////////////////////////////////////////
    WRITE    MACRO R3,R1
    BCF        INTCON, GIE
    MOVF        R3    , W;adresi w ye yaz
    BANKSEL    EEADR
    MOVWF    EEADR        ;adresi seç
    BANKSEL    R1
    MOVF        R1    , W; veriyi w ye yaz
    BANKSEL    EEDAT
    MOVWF    EEDAT        ;veriyi yaz
    BANKSEL    EECON1
    BCF        EECON1, EEPGD    ;kayıt için eeprom u seç 
    BSF        EECON1, WREN    ;yazmayı aç
    MOVLW    0X55
    MOVWF    EECON2        ;Write 55h
    MOVLW    0XAA
    MOVWF    EECON2        ;Write AAh
    BSF        EECON1  ,WR    ; WR biti ile yazmaya başla
    BTFSC      EECON1  ,WR    ; yazma tamamlanınca WR otm 0 olur
    GOTO        $-1
    BCF        EECON1, WREN    ;yazmayı kapat
    BCF        STATUS,RP1
    BCF        STATUS,RP0            ;Bank 0
    ENDM

;////////////////////////////////////////////////////////////////
    ;EEPROM OKUMA
;////////////////////////////////////////////////////////////////
READ    MACRO    R3
    MOVF    R3, W          ; adresi W ye yaz
    BANKSEL    EEADR
    MOVWF    EEADR        ;adrese git
    BANKSEL    EECON1
    BCF        EECON1, EEPGD    ;eeprom u seç
    BSF        EECON1, RD      ;okumayı aç
    BTFSC    EECON1, RD        ; okuma tamamlanınca ptm 0 olur
    GOTO        $-1
    BANKSEL    EEDAT
    MOVF        EEDAT, W        ;W = EEDAT
    BANKSEL PORTA
    ENDM
makro kullanımı yazma için WRITE ADRES, DATA
okuma için READ ADRES şeklinde olacak.okuma sonucu W ye yazılır.
Hep meraktan

alikeskinkilic


TOGGLE	MACRO	PORT?,R0
		MOVLW	0X01<<R0
		XORWF	PORT?	,F
                ENDM
Ana program içerisinde TOGGLE PORT?,5 (soru işareti yerine portun adı yazılacak A-B-C vb gibi)yazdığımızda pinin o anki durumunu tersleyecektir.Not.makrodaki soru işaretine ellemeyin kalacak meplab soru işaretini bizim ana programda yazdığımızla dolduracaktır.
Hep meraktan

alikeskinkilic

#29
koşullu dallanmalar için (<=,< ve =) içim makro tersi koşulları yazmadım zaten true/false çıkış verdiği için aynı makrolarla işlenebilir oldu.kod çıktısı diğer dillerin yarısından az tabi artı kısmı.kullanımını kodun başlığında açıklamaya çalıştım.denemeleri yaptım bi hata göremedim sorusu olan veya hata bulan olursa yazar.
;///////////////////DEĞER KIYASLAMASI//////////////////////////////////
;KULLANIMI= KARŞILAŞTIRILACAK HER BİR "WORD" DEĞERİ ARDIŞIK RAM BÖLGELERİNDE TUTULMALI 
;R4 VE R5 DEĞERLERİNİ ASCII DEĞERLER OLARAK İLGİLİ İŞARETLER OLARAK SEÇTİM 
;MAKRODA "=" SENBOLÜ KABUL EDİLMEDİĞİ İÇİN DEC KARŞILIĞI YAZILDI
;AMA ANA PROGRAMDA KULLANILABİLİR OLDU
;ÖRNEK KODLAR=          KIYAS A,"<","=",B 
;            KIYAS A,"<"," ",B
;            KIYAS A,"="," ",B
;            BTFSS    R6    ,0
;            GOTO    ****
;            GOTO ****
;BOŞ BIRAKILAN SEMBOL YERİNE ASCII BOŞLUK BIRAKILMALI
;R6 ADRESİNİN İLK BİTİ TRUE/FALSE DÖNDÜRÜR 
;MAKRO ÇIKIŞI R6 , 0 BİTİ KONTROL EDİLEREK İŞLEM YAPILIR
;" > " YADA ">=" İŞARETİ İÇİN AYRI BİR İŞLEME GEREK YOK MEVCUT İŞLEMLERİN TERSİ OLDUĞUNDAN SADECE DEĞİŞKEN YERİ DEĞİŞECEK    
KIYAS    MACRO    R0,R4,R5,R2
    IF  R4 == "<" && R5 == 61
        MOVF    R0+1        ,W            ;IF Y <= ART THEN GOTO KAPA
        SUBWF    R2+1        ,W            ;
        BTFSS    STATUS    ,C            ;
        GOTO        YANLIS                ;GOTO        SAG_KAPA
        BTFSS    STATUS    ,Z
        GOTO        DOGRU                ;GOTO        SAG_AC    
        MOVF    R0        ,W                                
        SUBWF    R2        ,W
        BTFSS    STATUS    ,C
        GOTO        YANLIS
        GOTO        DOGRU
        
    
        

        ENDIF
    IF  R4 == "<" && R5 == 32
        MOVF    R0+1        ,W            ;IF Y < ART THEN 
        SUBWF    R2+1        ,W            ;
        BTFSS    STATUS    ,C            ;
        GOTO        YANLIS                    ;GOTO        SAG_KAPA
        BTFSS    STATUS    ,Z
        GOTO        DOGRU            ;GOTO        SAG_AC    
        MOVF    R0        ,W                                
        SUBWF    R2        ,W
        BTFSC    STATUS    ,Z
        GOTO        YANLIS
        BTFSS    STATUS    ,C
        GOTO        YANLIS
        GOTO        DOGRU
    
        ENDIF
        
    IF    R4 == 61 && R5 == 32                    ;IF A=B
        MOVF    R0+1            ,W
        XORWF    R2+1        ,W
        BTFSS    STATUS    ,Z
        GOTO        YANLIS
        MOVF    R0        ,W
        XORWF    R2        ,W
        BTFSS    STATUS    ,Z
        GOTO    YANLIS
        GOTO    DOGRU
        ELSE

        GOTO    EXT
        ENDIF
YANLIS:
        BCF    R6        ,0
        GOTO    EXT
DOGRU:                                
        BSF    R6        ,0
        GOTO    EXT

EXT:
        ENDM    
     
Hep meraktan