Diğer diller ve Derleyiciler => Assembly (ASM) => Konuyu başlatan: alisumer - 11 Aralık 2022, 01:56:13
Başlık: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 11 Aralık 2022, 01:56:13
bilindiği gibi ASM komut seti olarak basit fakat algoritma oluşturma açısından zor bir dil.şöyle açıklıyayım örneğin pic basic de a= b*c komutu asm karşılığı olarak zor ve asm için karmaşık bir algoritma çalıştırıyor sebebi ise çipin içerisinde gömülü olarak bir çarpıcı/bölücü bulunmaması bu yüzden bir döngü içerisinde çarpma işlemi yada bölme işlemi gibi donanımsal desteği olmayan (ki neredeyse hiç bir işlemcide yok) işlemlerde çarpan kadar çarpılanı toplayarak sonucu bulmak zorunda.bunun değişik yolları mevcut örneğin 2 tabanında aritmetik işlemleri youtube de aratırsanız birkaç değişik yöntem bulabilirsiniz. Üst seviye diller ise bu algoritmaları yani daha önce geliştiriciler tarafından yazılan makroları kendi ide'lerine derleme esnasında o komutun karşılığı olarak ilgili kod satırına eklemeyi sağlıyorlar.iş buraya kadar üst seviye dillere bir puan fazla veriyor işleyişte ise bize yavşlık olarak ödünleşmeyi getiriyor. bense burada ASM dilini üst seviye dili gibi hazır algoritmalar ile kullanmayı elimden geldiğince "video olmadan" anlatmaya çalışacağım tabi bikaç hilesini de göstereceğim.ilk hile ise hazırda kullanılan üst seviye dillerinin kendi kütüphanelerini ve makrolarını kendimize göre düzenleyerek kullanmak.buradaki örneğim bir çarpma işleminin pic basic kütüphanesini kullanılarak yapılmasını göstermek.oradan bir makra yapacağız; ilk olarak C:\pbp dosyasında pbppic14.lib dosyasına dalıyoruz.yapmak istediğimiz çarpma işlemi olduğu için onun ile ilgili satırları arıyoruz."Math routines" başlığı altına "mull" komutu kullanılması halinde programa eklenecek satırlar mevcut ki onlar:
;****************************************************************
;* MUL : 16 x 16 = 32 multiply *
;* *
;* Input : R3 * R1 *
;* Output : R2, W = low word *
;* : R0, R2 + 1 = mid word *
;* : R0 = high word *
;* *
;* Notes : *
;****************************************************************
ifdef MUL_USED
LIST
MUL movlw 16 ; For 16 shifts
movwf R4
clrf R0 + 1
clrf R0
mulloop rrf R3 + 1, F
rrf R3, F
btfss STATUS, C
goto mull1 ; Skip add
movf R1, W ; 16-bit add with carry out
addwf R0, F
movf R1 + 1, W
btfsc STATUS, C
incfsz R1 + 1, W
addwf R0 + 1, F
mull1 rrf R0 + 1, F
rrf R0, F
rrf R2 + 1, F
rrf R2, F
decfsz R4, F
goto mulloop
movf R2, W ; Get low byte to W
goto DONE
NOLIST
DONE_USED = 1
endif
burada ifdef koşulu kafanızı karıştırmasın mplab ide de bu komutun karşılığı mevcut ama kendisi bir asm komutu değil sadece derleme esnasında define ile tanımladığımız ne ise ki burada mull diye tanımlanmış eğer bu tanımlamadaki gibi mull yazılırsa alttaki kod satırını derle demek koda dahil değil.ve biz de onu sileceğiz ve bu satırları makro olarak değiştireceğiz. geri kalanı resim ve kodları ekleyerek anlatmaya çalışayım.
;previous_error = setpoint - process_feedback//önceki hata = ayar noktası - süreç geri bildirimi
;
;integral = 0
;start:
; error = setpoint - actual_position //hata = ayar noktası - gerçek_pozisyon
; integral = integral + (error*dt) //Hata ve bir önceki örneklemedeki hatalar toplanır
; derivative = (error - previous_error)/dt //Hatadaki değişim miktarı belirlenir
;output = (Kp*error) + (Ki*integral) + (Kd*derivative) //Çıkış bu değişkenlerin toplamıyla
; previous_error = error //Her çevrimde o andaki hata değeri saklanır
; wait(dt) //Örnekleme zamanı kadar beklenir
;goto start
;
PID1 MACRO
MOVFW KONUM
SUBWF ADO ,W ; 0x38 = 0x20-0x28
MOVWF HATA
BTFSS _C
DECF ADO+1 ,F
MOVFW KONUM+1
SUBWF ADO+1 ,W
MOVWF HATA+1
ENDM
;****************************************************************
;* MUL : 16 x 16 = 32 multiply *
;* *
;* Input : R3 * R1 *
;* Output : R2, W = low word *
;* : R0, R2 + 1 = mid word *
;* : R0 = high word *
;* *
;* Notes : *
;****************************************************************
CARP MACRO R3,R1,R1+1
MUL
MOVFW R3
MOVWF PID_P
MOVFW R3+1
MOVWF PID_P+1
MOVLW .16 ; For 16 shifts
MOVWF R4
CLRF R0 + 1
CLRF R0
mulloop
BCF _C
RRF R3 + 1, F
RRF R3, F
BTFSS _C ;STATUS, C
GOTO mull1 ; Skip add
MOVF R1, W ; 16-bit add with carry out
ADDWF R0, F
MOVF R1 + 1, W
BTFSC _C ;STATUS, C
INCFSZ R1 + 1, W
ADDWF R0 + 1, F
mull1
RRF R0 + 1, F
RRF R0, F
RRF R2 + 1, F
RRF R2, F
DECFSZ R4, F
GOTO mulloop
MOVF R2, W ; Get low byte to W
DONE
BCF STATUS, IRP ; 1 Set FSR to bank 0/1
BCF STATUS, RP1 ; 1 Show direct bank 0
BCF STATUS, RP0 ; 1
; GOTO PID2
ENDM
buda kütüphane olarak kullandığım makrolar. (https://i.ibb.co/QM0jMR6/Pl-EBjg-Ok-Qe.png) (https://ibb.co/QM0jMR6) buda sağlaması bu şekilde mokrolar ile rutin ayarları,algoritmaları v.s basit şekilde üst seviye diller gibi yazabiliyoruz mesela işlemciye spi haberleşme için gerekli ayarlamaları spibegin adı ile bir makro yapıp ana kod bloğunda sadece" spibegin" yazdığımızda gerekli ayarların yapıldığı kod satırlarını programıza otomatik ekleyebiliyoruz. bununla ilgili içerisinde pid den tutunda 32bit çarpma bölme sin,cos gibi işlemlerin ayrıca "c" den araklayabilirsem işaretli sayılar ve onlarla işlemlerin olduğu bir kütüphane oluşturmaya başladım geliştirdikçe buradan da paylaşmayı düşünüyorum.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 11 Aralık 2022, 03:40:12
(https://i.ibb.co/mRHXdTk/q-Rp-XMKh5-JF.png) (https://ibb.co/mRHXdTk) burada da 32 bit çarpım yapılıyor gene aynı makro kullanılarak .Bildiğiniz gibi basic de 32 bitlik bu veriyi dışarı çıkaramıyorduk kütüphaneyi biraz düzenleyince artık bu veriyi 4 byte şeklinde çıkarmak mümkün
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: Serk@n - 11 Aralık 2022, 08:23:08
Emeğinize sağlık. Konuyla ilgili merak ettiğim bir husus var. ASM için kullanılan ide ortamı ve pice yükleme şekli farklı mıdır? Kabaca bir bilgi sahibi olmak için sormak istedim.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 11 Aralık 2022, 08:42:00
Rogramı Pic e yükleme farklı olmaz hangi dili kullandığınızın bir önemi yok hepsinde aynı.derleme sonucunda oluşan hex dosyası yüksek seviye dillerde belli ölçüde kabarık olmak zorunda sadece. çünkü Universal şeklde bütün varyasyonlar da bir fonksiyon çalıştırılması gerekli bunu yapabilmek için sorgu üstüne sorgu yapmalılar .ASM de bu seçenek bizde tam olarak hangi çipi ve hangi makroları kullanacağımız belli olduğundan diğerlerinin varlığını kontrol etmek zorunda değiliz
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 11 Aralık 2022, 20:14:43
pic C ve proton için asm kütüphanesi mevcutmu bilgisayarında kurulu olan varsa rica etsem lib ve makro dosyalarını paylaşabilirlermi.float ve işaretli sayılar ile makroları oradan araklarsam fena olur.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 20 Aralık 2022, 11:11:23
MOVFF MACRO R5,R6
;R5 =BANK0--------R6 = BANK0
IF (R5) < 0X80 && (R6) < 0X80
BCF STATUS ,RP0
BCF STATUS ,RP1
MOVF R5 ,W
MOVWF R6
ENDIF
;////////////R5 =BANK0--------R6 = BANK1/////////////////
IF (R5) < 0X80 && (R6) > 0X7F&&(R6)<0X100
BCF STATUS ,RP0
BCF STATUS ,RP1
MOVF R5 ,W
BSF STATUS ,RP0
MOVWF R6
BCF STATUS ,RP0
ENDIF
;-------------------R5=BANK0--------R6=BANK2/////////////////
IF (R5) < 0X80 && (R6) > 0XFF&&(R6)<0X180
BCF STATUS ,RP0
BCF STATUS ,RP1
MOVF R5 ,W
BSF STATUS ,RP1
MOVWF R6
BCF STATUS ,RP1
ENDIF
;-------------------R5=BANK0--------R6=BANK3/////////////////
IF (R5) < 0X80 && (R6) > 0X17F
BCF STATUS ,RP0
BCF STATUS ,RP1
MOVF R5 ,W
BSF STATUS ,RP1
BSF STATUS ,RP0
MOVWF R6
BCF STATUS ,RP0
BCF STATUS ,RP1
ENDIF
; ;/////////////R5=BANK1-------R6=BANK0//////////////////
IF (R5) > 0X7F&&(R5)<0X100 && (R6) < 0X80
BSF STATUS ,RP0
MOVF R5 ,W
BCF STATUS ,RP0
MOVWF R6
ENDIF
;/////////////R5=BANK1-------R6=BANK1//////////////////
IF (R5) > 0X7F&&(R5)<0X100 && (R6) > 0X7F && (R6) < 0X100
BSF STATUS ,RP0
MOVF R5 ,W
MOVWF R6
BCF STATUS ,RP0
ENDIF
;/////////////R5=BANK1-------R6=BANK2//////////////////
IF (R5) > 0X7F&&(R5)<0X100 && (R6) > 0XFF && (R6) < 0X180
BSF STATUS ,RP0
MOVF R5 ,W
BCF STATUS ,RP0
BSF STATUS ,RP1
MOVWF R6
BCF STATUS ,RP0
BCF STATUS ,RP1
ENDIF
;/////////////R5=BANK1-------R6=BANK3//////////////////
IF (R5) > 0X7F&&(R5)<0X100 && (R6) > 0X17F
BSF STATUS ,RP0
MOVF R5 ,W
BSF STATUS ,RP1
MOVWF R6
BCF STATUS ,RP0
BCF STATUS ,RP1
ENDIF
;/////////////R5=BANK2-------R6=BANK0//////////////////
IF (R5) > 0XFF && (R5) < 0X180 && (R6) < 0X80
BSF STATUS ,RP1
MOVF R5 ,W
BCF STATUS ,RP1
MOVWF R6
ENDIF
;/////////////R5=BANK2-------R6=BANK1//////////////////
IF (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X7F && (R6) < 0X100
BSF STATUS ,RP1
MOVF R5 ,W
BSF STATUS ,RP0
BCF STATUS ,RP1
MOVWF R6
BCF STATUS ,RP0
ENDIF
;/////////////R5=BANK2-------R6=BANK2//////////////////
IF (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0XFF && (R6) < 0X180
BSF STATUS ,RP1
MOVF R5 ,W
MOVWF R6
BCF STATUS ,RP1
ENDIF
; ;/////////////R5=BANK2-------R6=BANK3//////////////////
IF (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X17F
BSF STATUS ,RP1
MOVF R5 ,W
BSF STATUS ,RP0
MOVWF R6
BCF STATUS ,RP1
BCF STATUS ,RP0
ENDIF
;/////////////R5=BANK3-------R6=BANK3//////////////////
IF (R5) > 0X17F && (R6) > 0X17F
BSF STATUS ,RP0
BSF STATUS ,RP1
MOVF R5 ,W
MOVWF R6
BCF STATUS ,RP0
BCF STATUS ,RP1
ENDIF
; ;/////////////R5=BANK3-------R6=BANK2//////////////////
IF (R5) > 0X17F && (R6) > 0XFF && (R6) < 0X180
BSF STATUS ,RP0
BSF STATUS ,RP1
MOVF R5 ,W
BCF STATUS ,RP0
MOVWF R6
BCF STATUS ,RP1
ENDIF
; ;/////////////R5=BANK3-------R6=BANK1//////////////////
IF (R5) > 0X17F && (R6) > 0X7F && (R6) < 0X100
BSF STATUS ,RP0
BSF STATUS ,RP1
MOVF R5 ,W
BCF STATUS ,RP1
MOVWF R6
BCF STATUS ,RP0
ENDIF
;/////////////R5=BANK3-------R6=BANK0//////////////////
IF (R5) > 0X17F && (R6) < 0X80
BSF STATUS ,RP1
BSF STATUS ,RP0
MOVF R5 ,W
BCF STATUS ,RP0
BCF STATUS ,RP1
MOVWF R6
ENDIF
ENDM
movff komutu kullanmak için kütüpane .işleyiş olarak movf ve ardından movwf komutunun kullanılmasını sağlıyor yani kod satırı derleme sonrası aynı hız oolarakta aynı .bize artısı ise yazdığımız kodda MOVFF ADRESH,ADO+1 MOVFF ADRESL,ADO şeklinde yazılabilmesi banklar arası geçiş vs makro içerisinde hallediliyor sadece görsel olarak kodumuz kısalıyor.şu an için sadece max 4 bank destekliyor gelişecek yeni versiyon picler için
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 20 Aralık 2022, 11:44:38
;;****************************************************************
;* MUL : 16 x 16 = 32 multiply *
;* *
;* Input : R3 * R1 *
;* Output : R2, W = low word *
;* : R0, R2 + 1 = mid word *
;* : R0 = high word *
;* *
;* Notes : *
;****************************************************************
CARP MACRO R3,R3+1,R1,R1+1
MUL
MOVLW .16 ; For 16 shifts
MOVWF R4
CLRF R0 + 1
CLRF R0
mulloop
BCF STATUS, C
RRF R3 + 1, F
RRF R3, F
BTFSS STATUS, C ;
GOTO mull1 ; Skip add
MOVF R1, W ; 16-bit add with carry out
ADDWF R0, F
MOVF R1 + 1, W
BTFSC STATUS, C
INCFSZ R1 + 1, W
ADDWF R0 + 1, F
mull1
RRF R0 + 1, F
RRF R0, F
RRF R2 + 1, F
RRF R2, F
DECFSZ R4, F
GOTO mulloop
DONE
CLRF R3
CLRF R3+1
CLRF R1
CLRF R1+1
ENDM
mull (çarpma) fonksiyonunun 32 bit sonuç veren hali.bu hali ile basic içinde de kullanılabiliyor asm kütüphanesi olarakta makro çıkışı makroya ait R0---R4 değişkenlerini sonucu istediğiniz değişkene attıktan sonra sıfırlamanız gerekiyor. başka bir çarpma için .birde asm de zaten ram adreslerini biz seçiyoruz ama basic'te kullanım için makroda kullanılan değişkenler için ram adreslerini belirtmemiz fena olmaz.ve basic için makro kısmını silip ana kodu call komutu ile çağırmalıyız tabi
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 24 Aralık 2022, 23:17:32
malsef bir hada yaptım MOVFF komutunda yeni versiyonda bir sorun oluştu oda şudur ki bu işlemler daha derleme esnasında olduğu için kod çalışırken status register değerinin ne olacağı tam olarak anlaşılamayacağından if koşulu çoğu durumda hata vermeye başladı.donanımsal bir desteği de olmadığı için en azından 16 serisi çipler için uygun bir çözüm bulamadım o anki bankın hangisi olduğu yönünde.bu yüzden bu güncelleme çalışmadı fakat eski hali ile tekrar paylaşacağım o hali çalışıyor birde yeni versiyonu olacak oda MOVFF F1,F2 komutunun öncesinde ve sonrasında gerek olursa bank değiştirme işlemini kendimiz yapmamız yani eğer F1 o an çalıştığımız banktan farklı bir bankta ise komut öncesi F1 in bankına geçmek eğer F2 farklı bankta ise zaten makro içerisinde gene ayarlanıyor olacak sadece girişte ve çıkışta hangi bankta işlem yapacağımıza biz karar vermiş olacağız.tabi bu bizim programımıza görselliği biraz kaybetme pahasınada olsa gerekli olmadığı halde bank değişme yavaşlığından kurtulma imkanı verecek
R2 ve R2+1 manchester kodunu verir.birçok ır kumanda, rf vericiler bu kodlama ile işlem yapar sanayide de kullanımı halen sürmekte. saat sinyali ile veriyi xor işlemi ile birleştirip tek sinyal hattı ile gönderdiği için senkron kayması yapmaz bu nedenle güvenlidir ayrıca kablo masrafı da azdır (örn: araba hava yastıkları bu iletişim yöntemini kullanır ).manchester kodunda iki standart varmış (elimde simens'in otomatik sigortası var plc haberleşmesini IEEE standardında yapıyor) aslında birbinin tersi şeklinde koddaki "movlw 0x80 xorwf R2+1" bloğunun yeri değiştirilerek sisteminize uygun olanı seçilebilir.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 29 Aralık 2022, 22:17:19
Buda 16 bit manchester IEEE 802.3 kodunu 8 bit e çevirir.kod içerisinde MNCOD_IN F, F+1 şeklinde manchester kodu girildiğinde R3 de binary kod kaydedilir
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 30 Aralık 2022, 10:43:57
Belirtmeyi unutmuşum Çarpma fonksiyonu 16x16 bit diye yazdım ama dilerseniz 8x16 yada 16x8 bit işlem de yapabilirsiniz.örn: CARP A, ,B,B1 şeklinde kullanılmayan byte yerini boş şekilde gene varmış gibi "virgülle" ayırırsak işlemi gene yapar bu sefer 8x16 çarpar yada "CARP A, ,B, , "İşlemi 8x8 bit işlem yapar .Dikkat etmemiz gereken şey ise çarpma işlemine dahil etmeyeceğimiz boş virgülle ayırdığımız byte nin değerinin 0 olması gerekiyor .yani yukarıda yazmış olduğum 8x8 byte için A+1 ve B+1 registerlerinin değeri 0 olmalı hepsi bukadar.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 30 Aralık 2022, 11:58:51
Bölme makrosu gene çarpmadaki gibi kurallar 16x16 yada 16x8 veya 8x8 byte işlem yapılabilir tabiki Pic basic ten araklama :o
;****************************************************************
;* DIV : 16 x 16 (31 x 15) divide *
;* *
;* Input : (R0,R0+1) / (R1,R1+1) *
;* Output : R0, R0+1 = bolüm "SONUÇ" *
;* : R2 = remainder kalan *
;* *
;* Notes : R2 = R0 MOD R1 *
;****************************************************************
BOL MACRO R0 ,R0+1 ,R1 ,R1+1
CLRF R2
CLRF R2+1
BCF STATUS,C
DIV32DIV
movlw .16
movwf R5
divloop
rlf R0 + 1, W
rlf R2, F
rlf R2 + 1, F
movf R1, W
subwf R2, F
movf R1 + 1, W
btfss STATUS, C
incfsz R1 + 1, W
subwf R2 + 1, F
btfsc STATUS, C
goto divok
movf R1, W
addwf R2, F
movf R1 + 1, W
btfsc STATUS, C
incfsz R1 + 1, W
addwf R2 + 1, F
bcf STATUS, C
divok
rlf R0, F
rlf R0 + 1, F
decfsz R5, F
goto divloop
ENDM
güzel tarafı R2 kalanını 100 yada 1000 ile istediğimiz hassasiyete göre çarpıp tekrar bölene bölersek virgüllü sayıları da rahattlıkla gösterebiliriz hayırlı olsun.Örnek "BOL BOLUNEN,BOLUNEN+1,BOLEN,BOLEN+1"
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 30 Aralık 2022, 13:04:16
Bu güne kadar yazdığımız makroların çalıştığı örnek bir kod ve makro dosyası kod olarak
;****************************************************************
;* MUL : 16 x 16 = 32 multiply *
;* *
;* Input : R3 * R1 *
;* Output : R2, W = low word *
;* : R0, R2 + 1 = mid word *
;* : R0 = high word *
;* *
;* Notes : *
;****************************************************************
CARP MACRO R3,R3+1,R1,R1+1
MUL
MOVLW .16 ; For 16 shifts
MOVWF R4
CLRF R0 + 1
CLRF R0
mulloop
BCF STATUS, C
RRF R3 + 1, F
RRF R3, F
BTFSS STATUS, C ;
GOTO mull1 ; Skip add
MOVF R1, W ; 16-bit add with carry out
ADDWF R0, F
MOVF R1 + 1, W
BTFSC STATUS, C
INCFSZ R1 + 1, W
ADDWF R0 + 1, F
mull1
RRF R0 + 1, F
RRF R0 ,F
RRF R2 + 1,F
RRF R2 ,F
DECFSZ R4 ,F
GOTO mulloop
DONE
CLRF R3
CLRF R3+1
CLRF R1
CLRF R1+1
ENDM
;****************************************************************
;* DIV : 16 x 16 (31 x 15) divide *
;* *
;* Input : R0 / R1 *
;* Output : R0, R0+1 = bolüm *
;* : R2 = remainder kalan *
;* *
;* Notes : R2 = R0 MOD R1 *
;****************************************************************
BOL MACRO R0 ,R0+1 ,R1 ,R1+1
CLRF R2
CLRF R2+1
BCF STATUS,C
DIV32DIV
movlw .16
movwf R5
divloop
rlf R0 + 1, W
rlf R2, F
rlf R2 + 1, F
movf R1, W
subwf R2, F
movf R1 + 1, W
btfss STATUS, C
incfsz R1 + 1, W
subwf R2 + 1, F
btfsc STATUS, C
goto divok
movf R1, W
addwf R2, F
movf R1 + 1, W
btfsc STATUS, C
incfsz R1 + 1, W
addwf R2 + 1, F
bcf STATUS, C
divok
rlf R0, F
rlf R0 + 1, F
decfsz R5, F
goto divloop
movf R0, W ; Get low byte to W
ENDM
;////////////////////////// MOVFF KOMUTU////////////////////////////////////
; giriş ram = ram
MOVFF MACRO R5,R6
;R5 =BANK0--------R6 = BANK0
IF (R5) < 0X80 && (R6) < 0X80
MOVF R5 ,W
MOVWF R6
ENDIF
;////////////R5 =BANK0--------R6 = BANK1/////////////////
IF (R5) < 0X80 && (R6) > 0X7F&&(R6)<0X100
MOVF R5 ,W
BSF STATUS ,RP0
MOVWF R6
ENDIF
;-------------------R5=BANK0--------R6=BANK2/////////////////
IF (R5) < 0X80 && (R6) > 0XFF&&(R6)<0X180
MOVF R5 ,W
BSF STATUS ,RP1
MOVWF R6
ENDIF
;-------------------R5=BANK0--------R6=BANK3/////////////////
IF (R5) < 0X80 && (R6) > 0X17F
MOVF R5 ,W
BSF STATUS ,RP1
BSF STATUS ,RP0
MOVWF R6
ENDIF
; ;/////////////R5=BANK1-------R6=BANK0//////////////////
IF (R5) > 0X7F&&(R5)<0X100 && (R6) < 0X80
MOVF R5 ,W
BCF STATUS ,RP0
MOVWF R6
ENDIF
;/////////////R5=BANK1-------R6=BANK1//////////////////
IF (R5) > 0X7F&&(R5)<0X100 && (R6) > 0X7F && (R6) < 0X100
MOVF R5 ,W
MOVWF R6
ENDIF
;/////////////R5=BANK1-------R6=BANK2//////////////////
IF (R5) > 0X7F&&(R5)<0X100 && (R6) > 0XFF && (R6) < 0X180
MOVF R5 ,W
BCF STATUS ,RP0
BSF STATUS ,RP1
MOVWF R6
ENDIF
;/////////////R5=BANK1-------R6=BANK3//////////////////
IF (R5) > 0X7F&&(R5)<0X100 && (R6) > 0X17F
MOVF R5 ,W
BSF STATUS ,RP1
MOVWF R6
ENDIF
;/////////////R5=BANK2-------R6=BANK0//////////////////
IF (R5) > 0XFF && (R5) < 0X180 && (R6) < 0X80
MOVF R5 ,W
BCF STATUS ,RP1
MOVWF R6
ENDIF
;/////////////R5=BANK2-------R6=BANK1//////////////////
IF (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X7F && (R6) < 0X100
MOVF R5 ,W
BSF STATUS ,RP0
BCF STATUS ,RP1
MOVWF R6
ENDIF
;/////////////R5=BANK2-------R6=BANK2//////////////////
IF (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0XFF && (R6) < 0X180
MOVF R5 ,W
MOVWF R6
ENDIF
; ;/////////////R5=BANK2-------R6=BANK3//////////////////
IF (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X17F
MOVF R5 ,W
BSF STATUS ,RP0
MOVWF R6
ENDIF
;/////////////R5=BANK3-------R6=BANK3//////////////////
IF (R5) > 0X17F && (R6) > 0X17F
MOVF R5 ,W
MOVWF R6
ENDIF
; ;/////////////R5=BANK3-------R6=BANK2//////////////////
IF (R5) > 0X17F && (R6) > 0XFF && (R6) < 0X180
MOVF R5 ,W
BCF STATUS ,RP0
MOVWF R6
ENDIF
; ;/////////////R5=BANK3-------R6=BANK1//////////////////
IF (R5) > 0X17F && (R6) > 0X7F && (R6) < 0X100
MOVF R5 ,W
BCF STATUS ,RP1
MOVWF R6
ENDIF
;/////////////R5=BANK3-------R6=BANK0//////////////////
IF (R5) > 0X17F && (R6) < 0X80
MOVF R5 ,W
BCF STATUS ,RP0
BCF STATUS ,RP1
MOVWF R6
ENDIF
ENDM
;//////////////////////MANCHESTER KODU///////////////////////
;///////// 8 BİT VERİYİ MENCHESTER KODUNA DÖNÜŞTÜRME///////
MNCOD MACRO R3
MOVLW 0X08
MOVWF R1
CLRF R2
CLRF R2+1
LL:
BCF STATUS ,C
RRF R3 ,W
RRF R2+1
RRF R2
; MOVLW 0X80 ;G.E. Thomas STANDARDI İÇİN BU AÇILACAK
; XORWF R2+1
BCF STATUS ,C
RRF R3
RRF R2+1
RRF R2
MOVLW 0X80 ;IEEE 802.3 STANDARDI İÇİN BU AÇILACAK
XORWF R2+1
DECFSZ R1
GOTO LL
ENDM
;/////////////////////////MANCHESTER KODU BİNARY KODA ÇEVİRME///////////
MNCOD_IN MACRO R2 ,R2+1
MOVLW .8
MOVWF R1
CLRF R3
CLRF R3+1
BCF STATUS ,C
RRF R2+1
RRF R2
RRF R3
BCF STATUS ,C
RRF R2+1
RRF R2
DECFSZ R1
GOTO $-8
ENDM
buda tüm kütüphanelerin olduğu makrolar.KTPNE.INC olarak aynı dosya içine kaydederseniz tanır
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 31 Aralık 2022, 14:20:34
ASM de "define" ve "ifdef" koşuluna örnek ana programa "#define osc_8" diye bir tanımlama yapar ve makroda'da "ifdef osc_8 yazarsak 8 mhz için yaptığımız ayarları çalıştırabiliriz bir örnek verecek olursam
şeklinde yazarsak ana kodda #define osc_16 tanımlamasından sonra programın herhangi bir yerinde pause 1 yazarsak 16 mhz için olan kodu derleyecektir.tüm olasılıklar için bir algoritma geliştirmeye çalışıyorum kütüphane çok uzun olacak yoksa gerçi bizim programımıza bir etkisi olmayacak ama yazmaktan sıkılacağım kesin .
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 09 Ocak 2023, 12:13:59
negatif sayılarla işlemler için bir teorim var C dilinden pek anlamadığımdan kütüphaneleri çözemedim fakat.bir ASM gerçeği var ki aslında programladığımız düşük seviye çiplerin hiç birinde "-" bir değerin karşılığı gerçek anlamda yok.normalde sayı - olunca en değerli bit kullanım dışı kalıyor o işaret için.yani -255 sayısı için 2 byte lik yerimizin olması gerekiyor bunun yerine .başında bir işaret kullanmak aslında bir asci karakteri bir başka registerde tutup ne olduğuna bakıp eksi karakteri kullanılmış ise ardından gelen değeri "comf" ile tersleyip yani 2 ye tümleyenini alıp 1 ekleyerek o negatif değeri bulabiliriz gene -255 i göstermek için 2 byte kullanmış oluyoruz fakat kullanımı daha bir kolay ve asıl işlem yaptığımız verinin üst biti 0 mı 1 mi diye bakıp işlem sonunda da onu görmezden gelip değerden ayırmak zorunda kalmayız gibi sanki .böyle olunca mevcut paylaştığım kütüphanelerde çarpma veya bölme işlemleri için negatif değerleri hesaplamak sorun olmuyor fakat koşulu kütüphane içine henüz yerleştiremedim.destek atarsanız yada farklı bir fikir teori varsa beraber çözelim.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 02 Şubat 2023, 12:33:17
program başında "radix dec" veya "list r=dec " ifadesi ile program içerisinde vereceğimiz desimal 8 bitlik değerleri aşmadan şu tarz oynamalar yapabiliriz.böylelikle negatif sayıları dönüştürme işi ile uğraşmadan da işlemler yapabiliriz.NOT: radix belirtmeden varsayılan olarak aynı işlemleri HEX sayı sisteminde de yapabilirsiniz ama kontrolu güç olur böyle iyi
include "..........."
list r=dec
.........
BASLA:
CLRF STATUS
MOVLW -8*11 ; 0xA8 (-88) sayısını değişkenimize yazar yazar
MOVWF SAYI
MOVLW (28<<2)-42 ;0x46 (70) sayısını değişkene yazar
MOVWF KERE
ADDWF SAYI ,W ;TOPLAMA SONUCUNU 0XEE(-18) ŞEKLİNDE BULUR
bu yazım şeklini meblab ide kabul ediyor tüm denemelerim doğru sonuç verdi işlem eper 8 biti aşarsa alt byte gene doğru değeri verir ama üst byte kaybolur.bu hali ile bile birçok problemimi çözüyor.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 03 Şubat 2023, 15:45:47
32 Bit işaretli sayıları paket halinde değişkenlere yazmak için bir makro
#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
yazılan değer en fazla 2.147.483.647 ile -2.147.483.648 arası olabilir
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 06 Şubat 2023, 21:40:44
bir pinin durumunu terslemek için makro .program içerisinde örneğin "TOGGLE PORTA,5" yazıldığında porta 5 pini durum değiştirir NOT: makro içerisindeki soru işaretine dokunmayın MEPLAB soru işaretini ana programda yazdığımızla değiştirir.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 07 Şubat 2023, 01:35:17
;/////////////////////////////////////////////////////////////////
;EEPROM YAZMA
;/////////////////////////////////////////////////////////////////
WRITE MACRO R3,R1
BCF INTCON ,GIE ;KESMELERİ KAPAR (ÖNEMKİ KESME OLMAMALI YAZMA ESNASINDA)
BCF PIR2 ,EEIF ;PAYRAĞI İNDİR
MOVF R3 ,W ;
BANKSEL EEADR
MOVWF EEADR ;BELİRTTİĞİMİZ ADRESİ EEADR E YAZ(YAZILACAK ADRESİ SEÇ)
BANKSEL R1
MOVF R1 ,W ;
BANKSEL EEDAT
MOVWF EEDAT ;VERİYİ ADRESE YAZ
BANKSEL EECON1
BCF EECON1 ,EEPGD ;eeprom veya program hafızası seçilebilir.burada eeprom seçili
BSF EECON1 ,WREN ;yazmayı aç
MOVLW 0X55
MOVWF EECON2 ;yazma için rutin olan h55 ve hAA komutları eecon2 ye sırası ile yazılmalı
MOVLW 0XAA
MOVWF EECON2 ;eecon2 ye sırası ile yazılmalı
BSF EECON1 ,WR ;yazmaya başla
BTFSC EECON1 ,WR
GOTO $-1 ;bitene kadar takıl
BANKSEL PIR2
BTFSS PIR2 ,EEIF ;TAMAMLANINCA BAYRAK KALKAR DEVAM
GOTO $-1
BANKSEL EECON1
BCF EECON1 ,WREN ;yazmayı kapat
BCF STATUS ,RP1
BCF STATUS ,RP0 ;Bank 0
BCF PIR2 ,EEIF ;BAYRAĞI İNDİR
ENDM
;////////////////////////////////////////////////////////////////
;EEPROM OKUMA
;////////////////////////////////////////////////////////////////
READ MACRO R3
MOVF R3, W;
BANKSEL EEADR
MOVWF EEADR ;Data Memory ;Address to read
BANKSEL EECON1
BCF EECON1, EEPGD ;Point to DATA memory
BSF EECON1, RD ;EE Read
BTFSC EECON1, RD
GOTO $-1
BANKSEL EEDAT
MOVF EEDAT, W ;W = EEDAT
BANKSEL PORTA
ENDM
program içerisinde kullanılacak örnek kodlar YAZMA İÇİN " WRITE 3,VAR" okuma için "READ 3" komutları ile eepromun 3.adresine VAR değişkeni yazılır.okuma komutu ile de 3. adresten kaydedilmiş veri "W" ye yazılır.bu hali ile basic komutuna benzedi biraz.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 07 Şubat 2023, 02:01:49
ETE hocam bir sorum olacaktı iki butonum var ve birine bastığımda bir word değişkeni ardışık iki adrese ve diğerine bastığımda da ilk ikisinin ardından ilk adresten itibaren diğer bir word değişkeni yazdım örnek (0,1,2,3 adresleri gibi) bu adres başlangıcı olan sayıyı yani "0"ı da 255. adreste tuttum ve her yeni eprom kaydı sonrası bu adresi bir artırıp tekrar kaydettim program başında da adresi okuyarak hangi adresten kayda başlayacağımı bildim sonra de eeprom ömrünü uzatmak için saatlerce uğraşıp çok saçma bir yere vardığımı farkettim çünkü bu sefer de adresi tuttuğum 255.adresi hunharca kullanmış oldum :o.daha önce böyle bir paylaşım yapılmıştı ama bulamadım.çözüm hakkında yardımcı olurmusunuz.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: ete - 07 Şubat 2023, 09:42:26
Sorunu anladım. Benzer işlerle daha öncede uğraşmıştım. Burada temel amaç eprom hafızalarına dengeli biçimde gerektiği kadar yazma yapılmasıdır. Sıfır adresi dışında kalanları dengeli kullanıyorsun ama sıfırı da bu arada aşırı şekilde kullanmış oluyorsun. Ben son olarak şöyle bir mantık kullanmıştım. Senin örneğine benzeterek açıklayayım.
Sıfır nolu adresten kayıta başladık ve ilk 4 adrese değişkenlerini kayıt ettik. Elimizde 1 sayac daha olacak. Bu sayac ilgili adreslere kac defa kayıt ettiğimizi tutacak. Tabiiki bu değerleride kayıt etmek zorunda kalacaksın. Bu durumda kayıt adedin 5 olacak. Böylece ilk 5 adrese kayıt yaptın ve sondaki adres(baştakide olabilir) kayıt adedin olacak. Bu adreslere en azından 100 kayıt yada toplamda 255 kayıt yapacağını düşünebilirsin. Şimdi diyelimki adres kayıt limitini doldurdun. Yapılacak iş 0+5=5 nolu adresten itibaren yenilerini kayıt etmek ve 0-4 arasına 255 değerini yeniden yazmak olacak. Böylece okuma yaparken 255 lerin bittiği yeri bulup onu kayıt altında tutman bir dahaki kayıtı oraya yapman yeterli olacaktır. 255 den küçük bir değer bulunmaz ise işin başında olduğunu anlayabilir ve sıfır nolu adresten işe başlarsın. Böylece adresleri dengeli şekilde tutabilirsin. Önceleri adres göstergesinide kayıt ediyordum ama sonradan fazla işe yaramadığına karar verip yanlızca kayıt adedini tutuyordum. Bu iş akıl işidir. Bir başkası daha akıllıca bir yöntem bulabilir. Kafa yormak gerek. Amacımız eprom adreslerini dengeli şekilde kullanmak hep aynı adrese kayıt yapmamak. Düşünün bakalım.
Ete
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 07 Şubat 2023, 13:59:50
Anladım sanırım tek eksi yanı sisteme ilk enerji verildiğinde epromda ff harici ilk değeri bulana kadar okuma yapıp ilk baştaki 0-254 arası sınırladığım kayıt adedini bulana kadar bir gecikme olacak.teşekkürler hocam.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: ete - 07 Şubat 2023, 14:58:05
Eprom okumasında bekleme yapılmıyor biliyorsun. Toplam 256 adres okunacak ki bu çok kısa sürede halledilir. Üstelik her açılışta belirli bir gecikme uygulandığınıda unutma. Onu minimumda (150ms dir) tutarsın gerisi 100 ms bile tutmaz diye düşünüyorum. Kısaca sorun olmaz. Ama emniyetli bir sistem bana kalırsa.
Ete
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 09 Şubat 2023, 04:15:19
Karşılaştırma fonksiyonları için makrolar.
;///////////////////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: ;GOTO SAG_KAPA
BSF R6 ,0
GOTO EXT
EXT:
ENDM
işaretleri ascii olarak kullanmak zorunda kalmam dışında iş görür tabi bide adı kıyas ::) .ayrıca diğer dillerin karşılaştırma sonucu çıkardığı koddan çok daha kısa kod üretiyor.kullanımını kodun üzerinde başlık kısmında yapmaya çalıştım soru yada kodda bir sorun olursa bildirin lütfen.denemelerini yaptım hata bulamadım ama insanlık hali.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 11 Şubat 2023, 18:39:58
programı işlemciye yazdığımız esnada eeprom'a veri yazmak içindir,program çalışması esnasında herhangi bir yazma yapmaz.program içerisinde rutin eprom yazma kodları ile tekraren değiştirilebilir tabiki.
org 0x00
basla:
çalışan programlarımız
......
.......
goto basla
ORG 0X2100 ; eepromun çoğu 16 f serisinde başlangıç adresi
DE 0, 0, 0, 0, 0, 0 ;ilk adresten başlayarak 5. adrese kadar 0 yazar
END
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 11 Şubat 2023, 19:31:57
aynı formatı gene ilgili adreslerinde örneğin org 0x800 kullanılarak bu sefer program hafızasına "data,da veya dw"komutları kullanılarak yazılabilir
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 16 Şubat 2023, 13:24:55
Klasik for-next döngüsü için bir makro "FOR 10,200" şeklinde kullanımı pic basic pro ya oldukça benzer oldu,işlevi ise for dan sonraki kodu next makrosunu görene kadar çalıştırır next makrosunda fordaki verilen koşula bakar ona göre kodu yeniden tekrarlar yada bir altından devam eder.şu an için sadece 255 e kadar tekrar yapabiliyor,for ve next iki ayrı makro olarak çalışır
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 27 Şubat 2023, 14:31:27
yeni bölme fonksiyonu bi kısmı araklama tabi :P işaretli 32 bit sayılarla işlem yapabiliyor 32/32=32 sonucu da 32 bit içinde saklıyor biraz zaman alıyor ama kısaltmanın yolunu buldum gibi deniyorum paylaşırım başarınca.MAP ile ilgili tüm makrolar 32 bit çarpma ve 32 bit bölme makrosundan ibaret.ikisi de aşağıda
;****************************************************************
;* MUL : 16 x 16 = 32 multiply *
;* *
;* Input : R3 * R1 *
;* Output : R2, W = low word *
;* : R0, R2 + 1 = mid word *
;* : R0 = high word *
;* *
;* Notes : *
;****************************************************************
MULL32 MACRO X1,X1+1,X2,X2+1
MUL3:
MOVLW .16 ; For 16 shifts
MOVWF XX
CLRF XSH + 1
CLRF XSH
mulloop:
BCF STATUS, C
RRF X1 + 1, F
RRF X1, F
BTFSS STATUS, C ;
GOTO mull1 ; Skip add
MOVF X2, W ; 16-bit add with carry out
ADDWF XSH, F
MOVF X2 + 1, W
BTFSC STATUS, C
INCFSZ X2 + 1, W
ADDWF XSH + 1, F
mull1:
RRF XSH + 1, F
RRF XSH ,F
RRF XSL + 1,F
RRF XSL ,F
DECFSZ XX ,F
GOTO mulloop
DONE:
CLRF X1
CLRF X1+1
CLRF X2
CLRF X2+1
ENDM
;****************************************************************
;* DIV : 16 x 16 (31 x 15) divide *
;* *
;* Input : R0 / R1 *
;* Output : R0, R0+1 = bolüm *
;* : R2 = remainder kalan *
;* *
;* Notes : R2 = R0 MOD R1 *
;****************************************************************
; ----BÖLÜNEN--- ----BÖLEN----
;*** 32 BIT SIGNED DIVIDE ***
;REGA / REGB -> REGA
;Remainder in REGC
;Return carry set if overflow or division by zero
;*** 32 BIT SIGNED DIVIDE ***
;REGA / REGB -> REGA
;Remainder in REGC
;Return carry set if overflow or division by zero
BOL MACRO D0,D1,D2,D3,B0,B1,B2,B3
divide:
clrf DD1 ;Reset sign flag
call absa ;Make dividend (REGA) positive
skpc
call absb ;Make divisor (REGB) positive
skpnc
return ;Overflow
clrf DR0 ;Clear remainder
clrf DR1
clrf DR2
clrf DR3
movlw D'32' ;Loop counter
movwf DD
;call slac ;Purge sign bit
dvloop:
call slac ;Shift dividend (REGA) msb into remainder (REGC)
movf B3,w ;Test if remainder (REGC) >= divisor (REGB)
subwf DR3,w
skpz
goto dtstgt
movf B2,w
subwf DR2,w
skpz
goto dtstgt
movf B1,w
subwf DR1,w
skpz
goto dtstgt
movf B0,w
subwf DR0,w
dtstgt:
skpc ;Carry set if remainder >= divisor
goto dremlt
movf B0,w ;Subtract divisor (REGB) from remainder (REGC)
subwf DR0,f
movf B1,w
skpc
incfsz B1,w
subwf DR1,f
movf B2,w
skpc
incfsz B2,w
subwf DR2,f
movf B3,w
skpc
incfsz B3,w
subwf DR3,f
clrc
bsf D0,0 ;Set quotient bit
dremlt:
decfsz DD,f ;Next
goto dvloop
btfsc DD1,0 ;Check result sign
call negatea ;Negative
GOTO DIVCIK
;/////////////////////////////////////////////////////////////////
absa:
rlf D3,w
skpc
return ;Positive
negatea:
movf D3,w ;Save sign in w
andlw 0x80
comf D0,f ;2's complement
comf D1,f
comf D2,f
comf D3,f
incfsz D0,f
goto nega1
incfsz D1,f
goto nega1
incfsz D2,f
goto nega1
incf D3,f
nega1:
incf DD1,f ;flip sign flag
addwf D3,w ;Return carry set if -2147483648
return
;/////////////////////////////////////////////////////////////////
absb:
rlf B3,w
skpc
return ;Positive
negateb:
movf B3,w ;Save sign in w
andlw 0x80
comf B0,f ;2's complement
comf B1,f
comf B2,f
comf B3,f
incfsz B0,f
goto negb1
incfsz B1,f
goto negb1
incfsz B2,f
goto negb1
incf B3,f
negb1
incf DD1,f ;flip sign flag
addwf B3,w ;Return carry set if -2147483648
return
;///////////////////////////////////////////////////////////
slac:
rlf D0,f
rlf D1,f
rlf D2,f
rlf D3,f
slc:
rlf DR0,f
rlf DR1,f
rlf DR2,f
rlf DR3,f
return
DIVCIK:
ENDM
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 27 Şubat 2023, 14:35:11
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 02 Mart 2023, 14:00:08
Bölme makrosu biraz daha hızlandı 32 bit için sürekli kaydır çıkar işlemi yapıyordu önceden şu an en değerli basamağı bulana kadar sadece kaydırıyor böylece gereksiz çıkarma işleminden kurtuluyor tabi sayının büyüklüğüne göre süre farkı değişmekle beraber küçük sayılarda neredeyse yarı yarıya hızlanma oluyor ancak bölünen sayı 32 bit değerinde olursa eski makro ile aynı hızda çalışır. ayrıca makroya BOL A,A+1... şeklinde yazma işi de kalktı gerekli reg alanını 4 byte ayarladığınız taktirde ilk register adresini verince 4 byte adresleniyor yani DIV32 A,B yapınca 32 bit /32 bitlik işlem yapabiliyor .
CBLOCK 0X20
A :4
B :4
endc
BASLA:
DIV32 A,B
GOTO BASLA
END
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 13 Nisan 2023, 23:07:40
FOR NEXT ve TOGGLE makrosu daha işlevsel hale getirildi.makro içerisinde goto lable komutu ana programda birden fazla çalıştırıldığında çakışmaya neden olduğundan dallanmalar PCL üzerinden tekrar düzenlendi
TOGGLE MACRO PORT?,?0
MOVLW 0X01<<?0
XORWF PORT? ,F
ENDM
;////////////////////////////////FOR-NEXT DÖNGÜSÜ///////////////////////////////
;KULLANIMI "FOR 0,255" ; 255 TAKRAR YAPARAK FOR NEXT ARASINDAKİ KODU ÇALIŞTIRIR
; KODLAR
; ......
; NEXT
;*******************************************************************************
FOR MACRO R0,R2
MOVLW R2
MOVWF R4
MOVLW R0
SUBWF R4 ,F
MOVF PCL ,W
MOVWF R9
ENDM
NEXT MACRO
MOVF R9 ,W
DECFSZ R4 ,F
MOVWF PCL
ENDM
çalışma mantığı ile ilgili video ETE hocamın affına sığınarak
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 13 Nisan 2023, 23:26:02
belki de makro kullanımımızı en çok gerektirecek konulara geldik sabit modul ayarları (ADC,UART,SPI vb) gibi ayarların ve okumaların yapıldığı makrolarda sıra. şu an için ADC ve UART makrolarını yaptım hayırlı olsun.
;///////////////////////////////////////////////////////ADC////////////////////////////////////
;kullanımı ADC_SET şeklinde olup herhangi bir değişken içermez standart ayarları ana programda define ile belirttiğimiz osc değerine göre otomatik yapar
; //////////////////10 bit sağa yaslı format kullanır .
ADC_SET MACRO
BANKSEL ANSEL ;BANK2
CLRF ANSEL
CLRF ANSELH
;BANKSEL ADCON0
BCF STATUS ,RP1
MOVLW 0X80
MOVWF ADCON0
IFDEF OSC_4
;BANKSEL ADCON1
BSF STATUS ,RP0
MOVLW B'00010000 ; BÖLME ORANI OSC YE BAĞLI
MOVWF ADCON1
ENDIF
IFDEF OSC_8
;BANKSEL ADCON1
BSF STATUS ,RP0
MOVLW B'01010000
MOVWF ADCON1
ENDIF
IFDEF OSC_20
;BANKSEL ADCON1
BSF STATUS ,RP0
MOVLW B'00100000
MOVWF ADCON1
IFNDEF
BSF STATUS ,RP0
MOVLW B'01110000
MOVWF ADCON1
ENDIF
BCF STATUS ,RP0
ENDM
;*********************** ADC_READ ///////////////////////////////////////
;kullanımı "ADC_READ pin,değişken" şeklindedir Örnek "ADC_READ 0,SAYI "
;analog olarak ayarlanacak bacakların makro dışında tek ayarı bacakların giriş olarak ayarlanmasıdır
ADC_READ MACRO ?0,?1
BSF ADCON0 ,0
MOVLW ?0
ANDLW 0X0F
MOVWF R9
MOVWF 0X70
MOVLW 0X01
BSF STATUS ,RP1
BCF STATUS ,C
MOVWF ANSEL
MOVF 0X70 ,W
BTFSC STATUS ,Z
GOTO $+5
RLF ANSEL ,F
RLF ANSELH ,F
DECFSZ 0X70 ,F
GOTO $-3
BCF STATUS ,RP1
BCF STATUS ,C
RLF R9 ,F
RLF R9 ,W
; BANKSEL ADCON0
IORWF ADCON0
; BSF ADCON0 ,0
FOR 0,4
NOP
NOP
NEXT
;PAUSE 1
BSF ADCON0 ,1
BTFSC ADCON0 ,1 ; bayrak biti okumanın bittiğini kontrol etmek için izlenir
GOTO $-1
; PAUSE 1
MOVFF ADRESL,?1
MOVFF ADRESH,?1+1
ENDM
;///////////////////////////////////////////////////////////////////////////////
;///////////////////////UART_SET/////////////////////////////////////////////;
;kullanımı "UART_SET 230400,8,0" UART_SET baud,bit,ters/düz şeklindedir
;tüm asenkron ayarları makro içerisinde yapar bacakların giriş çıkışları dahil
UART_SET MACRO VAR,VAR1,VAR2
BANKSEL TXSTA
BCF TRISB ,7 ;tx
BSF TRISB ,5
MOVLW 0X24 ; TXEN,BRGH
MOVWF TXSTA
IF VAR2>0
BANKSEL BAUDCTL
MOVLW 0X18 ;İNVERTED
MOVWF BAUDCTL
ELSE
BANKSEL BAUDCTL
MOVLW 0X08
MOVWF BAUDCTL
; CLRF BAUDCTL ;NONİNVERTED
ENDIF ;
BANKSEL RCSTA ;
MOVLW 0X80 ;SPEN,CREN
MOVWF RCSTA
BANKSEL TRISA
IFDEF OSC_8
IF VAR==9600
MOVLW .207 ;
MOVWF SPBRG
ENDIF
IF VAR==10417
MOVLW .191 ;
MOVWF SPBRG
ENDIF
IF VAR==19200
MOVLW .103 ;
MOVWF SPBRG
ENDIF
IF VAR==57600
MOVLW .34 ;
MOVWF SPBRG
ENDIF
IF VAR==115200
MOVLW .16 ;
MOVWF SPBRG
ENDIF
IF VAR==230400
MOVLW .8 ;
MOVWF SPBRG
ENDIF
IF VAR1==8
BCF RCSTA ,RX9
ENDIF
IF VAR1==9
BSF RCSTA ,RX9
ENDIF
ENDIF
ENDM
;//////////////////////////////PRİNTF///////////////////
;asenkron veri gönderme
PRINTF MACRO ?0
MOVFF ?0,TXREG
BSF STATUS ,RP0
BTFSS TXSTA ,TRMT ; gönderimin bitmesi ile kalkan bayrak
GOTO $-1
BCF STATUS ,RP0
ENDM
uart kısmı şu an sadece 8 mhz için ayarlandı ifdef bloğu ile diğer frekanslara da uyarlanacak ayrı bir seri iletişim makro dosyasında hepsi toparlanacak şalışma mantığı açısından fikir verebilir.standart dışı olarak 230400 baud hızı eklendi hatasız çalıştı ,ayrıca alma için bir makro yapmadım o biraz daha karışık ama gelecek
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 16 Nisan 2023, 04:31:56
ADXL345 için hazırlanmış 4 kablolu SPI haberleşmesini ayarlayan ve sensörü sürekli ölçüm modunda 10bit, 2g , 100hz de işarette büyüklük ile (eksi ve artı değerleri veren)ayarlayan ve 3 eksen data çıkışını veren iki adet makro NOT: ana programda define ile CSN bacağı tanımlanmalı.örn= #DEFINE CSN PORTC,6
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 19 Ekim 2023, 21:37:49
S
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 19 Ekim 2023, 21:43:42
Uart haberleşme ve ayar makrolarıdır şu an için sadece osc 8 mhz ayarları mevcut.Ascii gönderme için farklı bir makro da yazdım ascii ile standart gönderme arasındaki farkı da görebilirsiniz basitçe
;///////////////////////////////////////////////////////////////////////////////
;///////////////////////UART_SET/////////////////////////////////////////////
; UART_SET BAUD,9OR8,TERS-DÜZ
; UART_SET 9600,8,0
UART_SET MACRO VAR,VAR1,VAR2
BANKSEL TXSTA
BCF TRISB ,7 ;tx
BSF TRISB ,5
MOVLW 0X24 ; TXEN,BRGH
MOVWF TXSTA
IF VAR2>0
BANKSEL BAUDCTL
MOVLW 0X18 ;İNVERTED
MOVWF BAUDCTL
ELSE
BANKSEL BAUDCTL
MOVLW 0X08
MOVWF BAUDCTL
; CLRF BAUDCTL ;NONİNVERTED
ENDIF ;
BANKSEL RCSTA ;
MOVLW 0X80 ;SPEN,CREN
MOVWF RCSTA
BANKSEL TRISA
IFDEF OSC_8
IF VAR==9600
MOVLW .207 ;
MOVWF SPBRG
BANKSEL PORTA
ENDIF
IF VAR==10417
MOVLW .191 ;
MOVWF SPBRG
BANKSEL PORTA
ENDIF
IF VAR==19200
MOVLW .103 ;
MOVWF SPBRG
BANKSEL PORTA
ENDIF
IF VAR==57600
MOVLW .34 ;
MOVWF SPBRG
BANKSEL PORTA
ENDIF
IF VAR==115200
MOVLW .16 ;
MOVWF SPBRG
BANKSEL PORTA
ENDIF
IF VAR==230400
MOVLW .8 ;
MOVWF SPBRG
BANKSEL PORTA
ENDIF
IF VAR1==8
BCF RCSTA ,RX9
ENDIF
IF VAR1==9
BSF RCSTA ,RX9
ENDIF
ENDIF
ENDM
;//////////////////////////////PRİNTF///////////////////UART HABERLEŞME SERİ GÖNDERME
PRINTF MACRO ?0
BANKSEL PORTA
BTFSC INTCON ,GIE
GOTO $+2
GOTO $+3
BCF INTCON ,7
BSF R9 ,0
MOVF ?0,W
MOVWF TXREG
BSF STATUS ,RP0
BTFSS TXSTA ,TRMT
GOTO $-1
BCF STATUS ,RP0
MOVF ?0+1,W
MOVWF TXREG
BSF STATUS ,RP0
BTFSS TXSTA ,TRMT
GOTO $-1
BCF STATUS ,RP0
MOVLW .13
MOVWF TXREG
BSF STATUS ,RP0
BTFSS TXSTA ,TRMT
GOTO $-1
BCF STATUS ,RP0
BTFSC R9 ,0
BSF INTCON ,7
ENDM
;////////////////////////////ASCİİ GÖNDERME//////////////////////////////
PRINTA MACRO ?0
BANKSEL PORTA
BTFSC INTCON ,GIE
GOTO $+2
GOTO $+3
BCF INTCON ,7
BSF R9 ,0
MOVLW ?0
MOVWF TXREG
BSF STATUS ,RP0
BTFSS TXSTA ,TRMT
GOTO $-1
BCF STATUS ,RP0
BTFSC R9 ,0
BSF INTCON ,7
ENDM
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 21 Ocak 2024, 15:31:38
Alıntı yapılan: alisumer - 13 Nisan 2023, 23:07:40FOR NEXT ve TOGGLE makrosu daha işlevsel hale getirildi.makro içerisinde goto lable komutu ana programda birden fazla çalıştırıldığında çakışmaya neden olduğundan dallanmalar PCL üzerinden tekrar düzenlendi
TOGGLE MACRO PORT?,?0
MOVLW 0X01<<?0
XORWF PORT? ,F
ENDM
;////////////////////////////////FOR-NEXT DÖNGÜSÜ///////////////////////////////
;KULLANIMI "FOR 0,255" ; 255 TAKRAR YAPARAK FOR NEXT ARASINDAKİ KODU ÇALIŞTIRIR
; KODLAR
; ......
; NEXT
;*******************************************************************************
FOR MACRO R0,R2
MOVLW R2
MOVWF R4
MOVLW R0
SUBWF R4 ,F
MOVF PCL ,W
MOVWF R9
ENDM
NEXT MACRO
MOVF R9 ,W
DECFSZ R4 ,F
MOVWF PCL
ENDM
çalışma mantığı ile ilgili video ETE hocamın affına sığınarak
düzeltme goto lable komutu aslında olabiliyormuş yöntemi ise makro içerisinde lokal kalmasını yani genel programa etki etmesini istemediğimiz değişken veya lable leri "local lable,var..." şeklinde yazdığımızda makroda kullandığımız değişkenler ve lable adresleri ana programda değişikliğe neden olmaz makrodan çıkıldıktan sonra aynı makroyu tekrar çalıştırdığımızda farklı PC numarası alır yani çakışma olmaz biraz karışık anlattım sanırım örnek vereyim
;////////////////////////////////FOR-NEXT DÖNGÜSÜ///////////////////////////////
;KULLANIMI "FOR 0,255" ; 255 TAKRAR YAPARAK FOR NEXT ARASINDAKİ KODU ÇALIŞTIRIR
; KODLAR
; ......
; NEXT
;*******************************************************************************
FOR MACRO ?0,?1 ;R10,R11
LOCAL for1
MOVLW ?1 ;R11
MOVWF R12
MOVLW ?0 ;R10
SUBWF R12 ,F
;MOVF PCL ,W
;MOVWF R13
for1:
ENDM
NEXT MACRO
MOVF R13 ,W
DECFSZ R12
goto for1;MOVWF PCL
ENDM
makroda ilk hali ve ikinci hali aynı anda var yorum yaptım sadece kod birkaç komut kısaldı daha iyi oldu.makro içindeki değişkenleri de ? şeklinde yapıp gereksiz atama derdinden kurtulduk ordanda iki üç kazanç var
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 21 Ocak 2024, 15:50:52
şimdi ise daha önce yazdığım tüm matematik kütüphanelerini bir kenara brakıp yeni bir makro yazdım sebebi ise tüm işlemlerin farklı değişkenlerde tutulma zorunluluğuydu(beceremediğimden tabi:) ) çok yer tutuyor fakat çok hızlı işlem yapıyorlardı bunun yerine http://www.piclist.com/tecHREF/microchip/index.htm (http://www.piclist.com/tecHREF/microchip/index.htm) sitesinde yazılı hazır kütüphanelerin iş görürlerini makroma adapte ettim böylelikle tüm işlemler için farklı değişkenler tanımlamak zorunluluğum kalktı kodlar biraz yavaşladı ama sorunsuz çalıştılar ne de olsa yazanlar asm nin kralları sayılır.bu deneme programı
__CONFIG 0x30E4
radix dec
LIST P = PIC16f690
INCLUDE "p16f690.inc"
; INCLUDE "EPROM.INC"
INCLUDE "MATH.INC"
; INCLUDE "fload.inc"
RADIX DEC
extern REGA0,REGB0,REGC0,subtract,add,multiply,divide,clrba,sqrt,DCOUNT,DCOUNT
;
; GLOBAL MAPS
; EXTERN FLO1624,INT2416,FPM24,FLO2424;R0,R1,R2,R3,R4,DIZ0,DIZ1,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,R17,D0,D1,D2,D3,DS,DR,M0,M1,M2,MS,IF0,IF1,F0,F1,DIV32L
; ENDC
VAR UDATA 0X20
X RES 4
Y RES 4
ZB RES 4
DIG RES 10
_TMP0 EQU 0X70
_TMP1 EQU 0X71
_TMP2 EQU 0X72
ORG 0X00
GOTO AYAR
ORG 0X04
AYAR:
PAKET32 301 ,X
PAKET32 302 ,Y
BASLA:
; TOPLA32 X,Y,ZB;
; DIV32 X,Y,ZB
; KAREKOK X,ZB
; MULL32 X,Y,ZB
; BCD X,DIG
; DIV32 ZB,Y,ZB
EGER X,"Z",Y
GOTO $+2
HESAP:
GOTO BASLA
GOTO BASLA
END
yorum larını kaldırırsanız tek tek deneme imkanınız olur
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 21 Ocak 2024, 15:51:46
bbu makro kodları (math.inc)
;//////////////// RAM ADRESİNDEN RAM ADRESİNE VERİ TRANSFERİ TAŞIMA ////////////////
;1 BYTE KULLANIMI= MOVFF A,B
;2 BYTE KULLANIMI= MIVFF16 A,B
;4 BYTE KULLANIMI= MIVFF32 A,B
;MOVFFL MAKROSU FARKLI BANKLARDA BULUNAN REGİSTERLER ARASINDA TAŞIMA YAPAR
MOVFF MACRO ?0,?1
MOVF ?0 ,W
MOVWF ?1
ENDM
MOVFF16 MACRO ?0,?1
MOVF ?0 ,W
MOVWF ?1
MOVF (?0+1) ,W
MOVWF ?1+1
ENDM
MOVFF32 MACRO ?0,?1
MOVF ?0 ,W
MOVWF ?1
MOVF ?0+1 ,W
MOVWF ?1+1
MOVF ?0+2 ,W
MOVWF ?1+2
MOVF ?0+3 ,W
MOVWF ?1+3
ENDM
MOVFFL MACRO ?0,?1
BANKSEL ?0
MOVF ?0 ,W
BANKSEL ?1
MOVWF ?1
BANKSEL ?0
ENDM
MOVFF16L MACRO ?0,?1
BANKSEL ?0
MOVF ?0 ,W
BANKSEL ?1
MOVWF ?1
BANKSEL ?0
MOVF ?0+1 ,W
BANKSEL ?1
MOVWF ?1+1
BANKSEL ?0
ENDM
MOVFF32L MACRO ?0,?1
BANKSEL ?0
MOVF ?0 ,W
BANKSEL ?1
MOVWF ?1
BANKSEL ?0
MOVF ?0+1 ,W ;26 KOMUT
BANKSEL ?1
MOVWF ?1+1
BANKSEL ?0
MOVF ?0+2 ,W
BANKSEL ?1
MOVWF ?1+2
BANKSEL ?0
MOVF ?0+3 ,W
BANKSEL ?1
MOVWF ?1+3
BANKSEL ?0
ENDM
;///////////////////////////32 BİT İARETLİ SABİT YAZMA//////////////////
;ÖRNEK= PAKET32 12345678,Out0 ; PAKET32 -12345678,Out0 yazıldığında da negatif değeri yazabilir adreslere
;RADIX DEC YAPILMALI DESİMAL SAYILAR İÇİN
;///////////////////////////////////////////////////////////////////////////////////////////////
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
;////////////////////16 BİT PAKET DEĞİŞKENLERE YAZILMASI///////////////////////////////////////////////
PAKET16 MACRO VAR,ADDRESS
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
ENDM
;/////////////////////////////////MATEMATİK İŞLEMLERİ (4 İŞLEM)///////////////////////////////////
;//////////////////////////////KULLANIMI İÇİN MATH.ASM TANITILMALI////////////////////////////////
;///////////////KULLANIMI TOPLA A,B,C ŞEKLİNDE A İLE B TOPLANIR C YE YAZILIR//////////////////////
;BÖLME İŞLEMİNDE KALAN HATILATICI OLARAK KULLANILAN REGC DE TUTULUT SONUÇ İSE GENE A/B=C ŞEKLİNDEDİR
;//////32BİT İŞARETLİ TOPLAMA////
TOPLA32 MACRO ?0,?1,?2
MOVFF32 ?0,REGA0
MOVFF32 ?1,REGB0
CALL add
MOVFF32 REGA0,?2
;CALL clrba
ENDM
;//////32BİT ÇARPMA İŞARETLİ/////
MULL32 MACRO ?0,?1,?2
MOVFF32 ?0,REGA0
MOVFF32 ?1,REGB0
CALL multiply
MOVFF32 REGA0,?2
ENDM
;///////32BİT İŞARETLİ BÖLME////
DIV32 MACRO ?0,?1,?2
MOVFF32 ?0,REGA0
MOVFF32 ?1,REGB0
CALL divide
MOVFF32 REGA0,?2
ENDM
;///////KAREKÖK alma/////////
KAREKOK MACRO ?0,?2
MOVFF32 ?0,REGA0
CALL sqrt
MOVFF32 REGA0,?2
ENDM
;////////BCD ÇEVİRİCİ/////////////
BCD MACRO ?0,?1
MOVFF32 ?0,REGA0
CALL bin2dec
ENDM
;////////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////////
;///////////////////////////BİR BİTİ TERSLER/////////////////////////////
;ÖRNEK= TOGGLE PORTA,5
;/////////////////////////////////////////////////////////////////////
TOGGLE MACRO PORT? ,?0
MOVLW 0X01<<?0
XORWF PORT? ,F
ENDM
;////////////////////////////////FOR-NEXT DÖNGÜSÜ///////////////////////////////
;KULLANIMI "FOR 0,255" ; 255 TAKRAR YAPARAK FOR NEXT ARASINDAKİ KODU ÇALIŞTIRIR
; KODLAR
; ......
; NEXT
;*******************************************************************************
FOR MACRO ?0,?1 ;R10,R11
local for1
MOVLW ?1 ;R11
MOVWF R12
MOVLW ?0 ;R10
SUBWF R12 ,F
;MOVF PCL ,W
;MOVWF R13
for1:
ENDM
NEXT MACRO
MOVF R13 ,W
DECFSZ R12
goto for1;MOVWF PCL
ENDM
;//////////////////////////////IF-THEN KOŞULLARI////////////////////////////////////
;KULLANIMI (EGER A,"<",B) KOMUT KARŞILIĞINDA KOŞUL DOĞRU İSE İKİ ALT SATIRA YANLIŞSA BİR ALT SATIRA GİDER
; (EGER A,"Z",B) A KÜÇÜK EŞİTSE ( Z İŞARETİ KÜÇÜK EŞİT İŞARETİNE EN ÇOK BENZEDİĞİ İÇİN SEÇİLDİ)
; (EGER A,"=",B) A VE B EŞİTSE
;///////////////////DEĞER KIYASLAMASI//////////////////////////////////
;KULLANIMI= KARŞILAŞTIRILACAK HER BİR "WORD" DEĞERİ ARDIŞIK RAM BÖLGELERİNDE TUTULMALI
;R15 VE R16 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
;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 "R4" , 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
EGER MACRO ?0,?2,?1;,?2
BCF STATUS ,C
BCF STATUS ,Z
; MOVF ?0 ,W
; MOVWF R15 ;R0
; MOVF ?0+1 ,W
; MOVWF R15+1 ;R0+1
; MOVF ?1 ,W
; MOVWF R16 ;R3
; MOVF ?1+1 ,W
; MOVWF R16+1 ;R3+1
IF ?2=="<" ;????????
MOVF ?0+1 ,W ;R0+1 ,W ;IF Y <= ART THEN GOTO KAPA
SUBWF ?1+1 ,W ;R3+1 ,W ;
BTFSS STATUS ,C ;
GOTO $+6
BTFSS STATUS ,Z
GOTO $+5
MOVF ?0 ,W ;R0 ,W
SUBWF ?1 ,W ;R3 ,W
BTFSS STATUS ,C
ELSE
; IF R1 == "<" && R2 == .32
IF ?2=="Z"
MOVF ?0+1 ,W ;IF Y < ART THEN
SUBWF ?1+1 ,W ;
BTFSS STATUS ,C ;
GOTO $+8
BTFSS STATUS ,Z
GOTO $+7
MOVF ?0 ,W
SUBWF ?1 ,W
BTFSC STATUS ,Z
GOTO $+3
BTFSS STATUS ,C
ELSE
IF ?2=="="
; IF R1 == .61 && R2 == .32
MOVF ?0+1 ,W
XORWF ?1+1 ,W
BTFSS STATUS ,Z
GOTO $+5
MOVF ?0 ,W
XORWF ?1 ,W
BTFSC STATUS ,Z
GOTO $+2
ENDIF
ENDIF
ENDIF
ENDM
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 21 Ocak 2024, 15:54:23
buda kütüphane dosyası (sub.asm) math.asm
INCLUDE "p16f690.inc"
INCLUDE "MATH.INC"
UDATA 0X56
REGA0 RES 1 ;lsb
REGA1 RES 1
REGA2 RES 1
REGA3 RES 1 ;msb
REGB0 RES 1 ;lsb
REGB1 RES 1
REGB2 RES 1
REGB3 RES 1 ;msb
REGC0 RES 1 ;lsb
REGC1 RES 1
REGC2 RES 1
REGC3 RES 1 ;msb
DSIGN RES 1 ;Digit Sign. 0=positive,1=negative
;DIGIT1 RES 1 ;MSD
;DIGIT2 RES 1
;DIGIT3 RES 1
;DIGIT4 RES 1
;DIGIT5 RES 1 ;Decimal (BCD) digits
;DIGIT6 RES 1
;DIGIT7 RES 1
;DIGIT8 RES 1
;DIGIT9 RES 1
;DIGIT10 RES 1 ;LSD
MTEMP RES 1
MCOUNT RES 1
DCOUNT RES 1
;*** 32 BIT SIGNED SUTRACT ***
;REGA - REGB -> REGA
;Return carry set if overflow
GLOBAL REGA0,REGB0,REGC0,subtract,add,multiply,divide,clrba,sqrt,DCOUNT,DCOUNT
CODE
subtract:
call negateb ;Negate REGB
skpnc
return ;Overflow
;*** 32 BIT SIGNED ADD ***
;REGA + REGB -> REGA
;Return carry set if overflow
add:
movf REGA3,w ;Compare signs
xorwf REGB3,w
movwf MTEMP
call addba ;Add REGB to REGA
clrc ;Check signs
movf REGB3,w ;If signs are same
xorwf REGA3,w ;so must result sign
btfss MTEMP,7 ;else overflow
addlw 0x80
return
;*** 32 BIT SIGNED MULTIPLY ***
;REGA * REGB -> REGA
;Return carry set if overflow
multiply:
clrf MTEMP ;Reset sign flag
call absa ;Make REGA positive
skpc
call absb ;Make REGB positive
skpnc
return ;Overflow
call movac ;Move REGA to REGC
call clra ;Clear product
movlw D'31' ;Loop counter
movwf MCOUNT
muloop:
call slac ;Shift left product and multiplicand
rlf REGC3,w ;Test MSB of multiplicand
skpnc ;If multiplicand bit is a 1 then
call addba ;add multiplier to product
skpc ;Check for overflow
rlf REGA3,w
skpnc
return
decfsz MCOUNT,f ;Next
goto muloop
btfsc MTEMP,0 ;Check result sign
call negatea ;Negative
return
;*** 32 BIT SIGNED DIVIDE ***
;REGA / REGB -> REGA
;Remainder in REGC
;Return carry set if overflow or division by zero
divide:
clrf MTEMP ;Reset sign flag
movf REGB0,w ;Trap division by zero
iorwf REGB1,w
iorwf REGB2,w
iorwf REGB3,w
sublw 0
skpc
call absa ;Make dividend (REGA) positive
skpc
call absb ;Make divisor (REGB) positive
skpnc
return ;Overflow
clrf REGC0 ;Clear remainder
clrf REGC1
clrf REGC2
clrf REGC3
call slac ;Purge sign bit
movlw D'31' ;Loop counter
movwf MCOUNT
dvloop:
call slac ;Shift dividend (REGA) msb into remainder (REGC)
movf REGB3,w ;Test if remainder (REGC) >= divisor (REGB)
subwf REGC3,w
skpz
goto dtstgt
movf REGB2,w
subwf REGC2,w
skpz
goto dtstgt
movf REGB1,w
subwf REGC1,w
skpz
goto dtstgt
movf REGB0,w
subwf REGC0,w
dtstgt:
skpc ;Carry set if remainder >= divisor
goto dremlt
movf REGB0,w ;Subtract divisor (REGB) from remainder (REGC)
subwf REGC0,f
movf REGB1,w
skpc
incfsz REGB1,w
subwf REGC1,f
movf REGB2,w
skpc
incfsz REGB2,w
subwf REGC2,f
movf REGB3,w
skpc
incfsz REGB3,w
subwf REGC3,f
clrc
bsf REGA0,0 ;Set quotient bit
dremlt:
decfsz MCOUNT,f ;Next
goto dvloop
btfsc MTEMP,0 ;Check result sign
call negatea ;Negative
return
;*** ROUND RESULT OF DIVISION TO NEAREST INTEGER ***
round:
clrf MTEMP ;Reset sign flag
call absa ;Make positive
clrc
call slc ;Multiply remainder by 2
movf REGB3,w ;Test if remainder (REGC) >= divisor (REGB)
subwf REGC3,w
skpz
goto rtstgt
movf REGB2,w
subwf REGC2,w
skpz
goto dtstgt
movf REGB1,w
subwf REGC1,w
skpz
goto rtstgt
movf REGB0,w
subwf REGC0,w
rtstgt:
skpc ;Carry set if remainder >= divisor
goto rremlt
incfsz REGA0,f ;Add 1 to quotient
goto rremlt
incfsz REGA1,f
goto rremlt
incfsz REGA2,f
goto rremlt
incf REGA3,f
skpnz
return ;Overflow,return carry set
rremlt:
btfsc MTEMP,0 ;Restore sign
call negatea
return
;*** 32 BIT SQUARE ROOT ***
;sqrt(REGA) -> REGA
;Return carry set if negative
sqrt:
rlf REGA3,w ;Trap negative values
skpnc
return
call movac ;Move REGA to REGC
call clrba ;Clear remainder (REGB) and root (REGA)
movlw D'16' ;Loop counter
movwf MCOUNT
sqloop:
rlf REGC0,f ;Shift two msb's
rlf REGC1,f ;into remainder
rlf REGC2,f
rlf REGC3,f
rlf REGB0,f
rlf REGB1,f
rlf REGB2,f
rlf REGC0,f
rlf REGC1,f
rlf REGC2,f
rlf REGC3,f
rlf REGB0,f
rlf REGB1,f
rlf REGB2,f
setc ;Add 1 to root
rlf REGA0,f ;Align root
rlf REGA1,f
rlf REGA2,f
movf REGA2,w ;Test if remdr (REGB) >= root (REGA)
subwf REGB2,w
skpz
goto ststgt
movf REGA1,w
subwf REGB1,w
skpz
goto ststgt
movf REGA0,w
subwf REGB0,w
ststgt:
skpc ;Carry set if remdr >= root
goto sremlt
movf REGA0,w ;Subtract root (REGA) from remdr (REGB)
subwf REGB0,f
movf REGA1,w
skpc
incfsz REGA1,w
subwf REGB1,f
movf REGA2,w
skpc
incfsz REGA2,w
subwf REGB2,f
bsf REGA0,1 ;Set current root bit
sremlt:
bcf REGA0,0 ;Clear test bit
decfsz MCOUNT,f ;Next
goto sqloop
clrc
rrf REGA2,f ;Adjust root alignment
rrf REGA1,f
rrf REGA0,f
return
;*** 32 BIT SIGNED BINARY TO DECIMAL ***
;REGA -> DIGITS 1 (MSD) TO 10 (LSD) & DSIGN
;DSIGN = 0 if REGA is positive, 1 if negative
;Return carry set if overflow
;Uses FSR register
;bin2dec:
; clrf MTEMP ;Reset sign flag
; call absa ;Make REGA positive
; skpnc
; return ;Overflow
; call clrdig ;Clear all digits
; movlw D'32' ;Loop counter
; movwf MCOUNT
;b2dloop:
; rlf REGA0,f ;Shift msb into carry
; rlf REGA1,f
; rlf REGA2,f
; rlf REGA3,f
; movlw DIGIT10
; movwf FSR ;Pointer to digits
; movlw D'10' ;10 digits to do
; movwf DCOUNT
;adjlp:
; rlf INDF,f ;Shift digit and carry 1 bit left
; movlw D'10'
; subwf INDF,w ;Check and adjust for decimal overflow
; skpnc
; movwf INDF
; decf FSR,f ;Next digit
; decfsz DCOUNT,f
; goto adjlp
; decfsz MCOUNT,f ;Next bit
; goto b2dloop
; btfsc MTEMP,0 ;Check sign
; bsf DSIGN,0 ;Negative
; clrc
; return
;
;
;;*** 32 BIT SIGNED DECIMAL TO BINARY ***
;;Decimal DIGIT1 thro DIGIT(X) & DSIGN -> REGA
;;Set DSIGN = 0 for positive, DSIGN = 1 for negative values
;;Most significant digit in DIGIT1
;;Enter this routine with digit count in w register
;;Return carry set if overflow
;;Uses FSR register
;
;dec2bin:
; movwf MTEMP ;Save digit count
; movlw D'32' ;Outer bit loop counter
; movwf MCOUNT
;
;d2blp1:
; movlw DIGIT1-1 ;Set up pointer to MSD
; movwf FSR
; movf MTEMP,w ;Inner digit loop counter
; movwf DCOUNT
;
; movlw D'10'
; clrc ;Bring in '0' bit into MSD
;
;d2blp2:
; incf FSR,f
; skpnc
; addwf INDF,f ;Add 10 if '1' bit from prev digit
; rrf INDF,f ;Shift out LSB of digit
;
; decfsz DCOUNT,f ;Next L.S. Digit
; goto d2blp2
;
; rrf REGA3,f ;Shift in carry from digits
; rrf REGA2,f
; rrf REGA1,f
; rrf REGA0,f
;
; decfsz MCOUNT,f ;Next bit
; goto d2blp1
;
; movf INDF,w ;Check for overflow
; addlw 0xFF
; skpc
; rlf REGA3,w
; skpnc
; return
;
; btfsc DSIGN,0 ;Check result sign
; call negatea ;Negative
; return
;
;
;UTILITY ROUTINES
;Add REGB to REGA (Unsigned)
;Used by add, multiply,
addba:
movf REGB0,w ;Add lo byte
addwf REGA0,f
movf REGB1,w ;Add mid-lo byte
skpnc ;No carry_in, so just add
incfsz REGB1,w ;Add carry_in to REGB
addwf REGA1,f ;Add and propagate carry_out
movf REGB2,w ;Add mid-hi byte
skpnc
incfsz REGB2,w
addwf REGA2,f
movf REGB3,w ;Add hi byte
skpnc
incfsz REGB3,w
addwf REGA3,f
return
;Move REGA to REGC
;Used by multiply, sqrt
movac:
movf REGA0,w
movwf REGC0
movf REGA1,w
movwf REGC1
movf REGA2,w
movwf REGC2
movf REGA3,w
movwf REGC3
return
;Clear REGB and REGA
;Used by sqrt
clrba:
clrf REGB0
clrf REGB1
clrf REGB2
clrf REGB3
;Clear REGA
;Used by multiply, sqrt
clra:
clrf REGA0
clrf REGA1
clrf REGA2
clrf REGA3
return
;Check sign of REGA and convert negative to positive
;Used by multiply, divide, bin2dec, round
absa:
rlf REGA3,w
skpc
return ;Positive
;Negate REGA
;Used by absa, multiply, divide, bin2dec, dec2bin, round
negatea:
movf REGA3,w ;Save sign in w
andlw 0x80
comf REGA0,f ;2's complement
comf REGA1,f
comf REGA2,f
comf REGA3,f
incfsz REGA0,f
goto nega1
incfsz REGA1,f
goto nega1
incfsz REGA2,f
goto nega1
incf REGA3,f
nega1:
incf MTEMP,f ;flip sign flag
addwf REGA3,w ;Return carry set if -2147483648
return
;Check sign of REGB and convert negative to positive
;Used by multiply, divide
absb:
rlf REGB3,w
skpc
return ;Positive
;Negate REGB
;Used by absb, subtract, multiply, divide
negateb:
movf REGB3,w ;Save sign in w
andlw 0x80
comf REGB0,f ;2's complement
comf REGB1,f
comf REGB2,f
comf REGB3,f
incfsz REGB0,f
goto negb1
incfsz REGB1,f
goto negb1
incfsz REGB2,f
goto negb1
incf REGB3,f
negb1:
incf MTEMP,f ;flip sign flag
addwf REGB3,w ;Return carry set if -2147483648
return
;Shift left REGA and REGC
;Used by multiply, divide, round
slac:
rlf REGA0,f
rlf REGA1,f
rlf REGA2,f
rlf REGA3,f
slc:
rlf REGC0,f
rlf REGC1,f
rlf REGC2,f
rlf REGC3,f
return
;Set all digits to 0
;Used by bin2dec
;
;clrdig:
; clrf DSIGN
; clrf DIGIT1
; clrf DIGIT2
; clrf DIGIT3
; clrf DIGIT4
; clrf DIGIT5
; clrf DIGIT6
; clrf DIGIT7
; clrf DIGIT8
; clrf DIGIT9
; clrf DIGIT10
; return
END
kütüphanedeki BCD işlemi için girilen kodları yorum yaptım kullanmadığımdan lazım olan açıp kullanabilir 10 basamak binary decimal dönüşümünü yapıyor.bcd için kullanılan değişkenleri Global satırına eklemeniz gerekiyor ana programda da external satırına ekleyiniz
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 22 Ocak 2024, 15:51:57
bir değişkenin ard arda değerlerinin bir başka byte uzunluğunu kendimizin belirlediği bir "dizi değişkene" kaydetmeye yarayan makrodur kullanım amacı genellikle Adxl tarzı bir sensörden okunan ard arda verilerin sıralı adreslere sırası ile kaydedilmesine yarar .ortalama almak yada data loger yapmak için kullanılabilir.kullanımına Örnek:
CBLOCK;Yada UDATA
DIZI :10 ;10 Byte uzunluğunda değişken
endc
SAYAC EQU 0X73 ;Her banktan ulaşılabilir olması için sayaç değişkenleri 0x70 üstüne yazılıyor
......
clrf SAYAC
......
ADXL_OKU:
......
movwf A
DIZ A,DIZI,10
GOTO ADXL_OKU
GOTO OKUMA_TAMAM
makro kodu ise:
DIZ MACRO ?0,?1,?2 ;?2 = kayıt sayısı
;?1 = kayıt yapılan dizi değişkeni ilk adresi yada adı
MOVLW ?1 ;?0 = kaydedeceğimiz değişken
ADDWF SAYAC ,W
MOVWF FSR
MOVFF ?0,INDF
INCF SAYAC ,F
MOVF SAYAC ,W
XORLW ?2
BTFSS STATUS ,Z
GOTO $+3
CLRF SAYAC
GOTO $+2
ENDM
belirttiğimiz sayı adedince kayıt yapılınca verdiğimiz komutun iki altına eğer verdiğimiz sayı kadar kayıt yapılmamışsa bir alt satıra gider Aynı BTFSS gibi
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 22 Ocak 2024, 16:27:42
Aynı makronun değişkenimizin 16 bit olması halinde çalışan iki bytelik versiyonu
kaç değer kaydedeceğimizi girdiğimiz değer doğal olarak yarı boyutta kayıt yapacaktır yani 10 tane 1 Byte değer yazarken artık 5 tane 2 byte değer sığdırabiliriz aynı adreslere doğal olarak önemli olan kayıt adedi ise DIZ16 komutunda sayı değerimiz de iki kat artmalı
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 23 Ocak 2024, 15:13:31
yeni makro dizi değişkendeki belli sayıda değerin en küçüğünü dizinin en başına taşır yer değiştirir. art arda çalıştırıldığında MEDIAN filtre( bir dizi değerin orta noktasını bulma) uygulamalarında iş görür.Örnek kodu:
__CONFIG 0x30E4
radix dec
LIST P = PIC16f690
INCLUDE "p16f690.inc"
; INCLUDE "EPROM.INC"
INCLUDE "MATH.INC"
; INCLUDE "fload.inc"
RADIX DEC
extern REGA0,REGB0,REGC0,subtract,add,multiply,divide,clrba,sqrt,DCOUNT,DCOUNT,subtract
;
; GLOBAL SAYAC
; EXTERN FLO1624,INT2416,FPM24,FLO2424;R0,R1,R2,R3,R4,DIZ0,DIZ1,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,R17,D0,D1,D2,D3,DS,DR,M0,M1,M2,MS,IF0,IF1,F0,F1,DIV32L
; ENDC
VAR UDATA 0X20
X RES 4
Y RES 4
ZB RES 4
DIG RES 20
_TMP0 EQU 0X70
_TMP1 EQU 0X71
_TMP2 EQU 0X72
SAYAC EQU 0X73
RAM0 EQU 0X74
RAM1 EQU 0X75
RAM2 EQU 0X76
RAM3 EQU 0X77
RAM4 EQU 0X78
RAM5 EQU 0X79
RAM6 EQU 0X7A
RAM7 EQU 0X7B
ORG 0X00
GOTO AYAR
ORG 0X04
AYAR:
PAKET32 200 ,X
PAKET32 302 ,Y
SELF:
DECF X ,F
BASLA:
; TOPLA32 X,Y,ZB;
; DIV32 X,Y,ZB
; KAREKOK X,ZB
; MULL32 X,Y,ZB
; BCD X,DIG
; DIV32 ZB,Y,ZB
; EGER X,"Z",Y
; CIKAR32 X,Y,X
DIZ X,DIG,5 ;x in değerini her seferinde bir azaltarak sıra ile DIG in ilk 5 adresine yazar
GOTO SELF
SIRALA DIG,5 ; ilk değeri diğer tüm değerler arasından en küçüğü ile değişir
SIRALA DIG+1,4 ; ikinci değeri kalan değerler arasından en küçüğü ile değişir
SIRALA DIG+2,3 ; öylece devam eder
SIRALA DIG+3,2
HESAP:
GOTO $
GOTO BASLA
END
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 23 Ocak 2024, 15:14:29
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 23 Ocak 2024, 15:17:07
mevcut for next makrosu bu yapı için uygun olmadığından yeni bir forr makrosu yazdım eski next makrosunu diğeri ile ortak kullanabiliyor sadece R11 v.s değişkenleri her banktan ulaşılabilen 0x7a ve 0x7b adresleri ile değiştim ikisini de atıyorum
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 04 Mayıs 2024, 15:56:27
;NEXTION ekran veri yazma makrosu
;NEXT_WRT n,0 ;n= verinin türü 0= verinin id'si
;NEXT_WRT t,0 == t0.txt="abcd123"0xff0xff0xff
;NEXT_WRT g,1 == g0.txt="abcd123"0xff0xff0xff
;NEXT_WRT n,2 == n0.val="1" "2" "3"0xff0xff0xff (0-...) (32bit uzunluk)
;NEXT_WRT j,3 == j0.val="1" "2" "3"0xff0xff0xff (0-100)
;NEXT_WRT z,4 == z0.val="1" "2" "3"0xff0xff0xff (0-360)
;NEXT_WRT p,5 == p0.pic="1" "2" "3"0xff0xff0xff (0-...) (hafıza kısıtı resim sayısı)
;/////////kullanımı:///////////////
SAYI İÇİN:
NEXT_WRT "n","0"
PRINTN NUM,4,0
NEXT_END "n"
txt VERİLERi İÇİN:
NEXT_WRT "t","0"
PRINTA "a"
NEXT_END "t"
;/////////////////////////
;NEXT_WRT t,0
;MOVLW "a"
;CALL GONDER ;seri giden veri : t0.txt="ali"0xff0xff0xff
;MOVLW "l" ;aslında tüm veriler ascii formatında gittiğinden
;CALL GONDER ;txt için ayrıca "" işareti kullanması ekranın
;MOVLW "i" ;yazı mı yoksa başka birşeymi olduğunu anlaması için (sanırım)
;CALL GONDER
;NEXT_END t
;*************************************************************************************************
NEXT_WRT MACRO ?0,?1
LOCAL YAZ_A,SOR
GOTO SOR
YAZ_A:
MOVWF ADR2
PRINTF ADR2,1
RETURN
SOR:
IF ?0=="t"
MOVLW "t" ;düz yazı için
CALL YAZ_A
MOVLW ?1 ; t0.txt="AliSümer"0xff0xff0xff
CALL YAZ_A
MOVLW "."
CALL YAZ_A
MOVLW "t"
CALL YAZ_A
MOVLW "x"
CALL YAZ_A
MOVLW "t"
CALL YAZ_A
MOVLW "="
CALL YAZ_A
MOVLW 0X22
CALL YAZ_A
ENDIF
IF ?0=="g"
MOVLW "g" ;kayan yazı için
CALL YAZ_A
MOVLW ?1 ;g0.txt="AliSümer"0xff0xff0xff
CALL YAZ_A
MOVLW "."
CALL YAZ_A
MOVLW "t"
CALL YAZ_A
MOVLW "x"
CALL YAZ_A
MOVLW "t"
CALL YAZ_A
MOVLW "="
CALL YAZ_A
MOVLW 0X22
CALL YAZ_A
endif
IF ?0=="n" ;numara için
MOVLW "n"
CALL YAZ_A ;n0.val="1""2""3"0xff0xff0xff
MOVLW ?1 ;gönderilen sayılar BCD ile decimal e çevrilip
CALL YAZ_A ;sonrasında ASCII formatına sokulmalı
MOVLW "." ;örnek:
CALL YAZ_A ;movlw .12
MOVLW "v" ;movwf a ;a=12
CALL YAZ_A ;BCD a,2 ;a=1,(a+1)=2
MOVLW "a" ;BCD makrosu içinde sayılara 0x30 ekleyerek ascii dönüşümü yapıyorum
CALL YAZ_A ;ASCII = 0X31,0X32
MOVLW "l"
CALL YAZ_A
MOVLW "="
CALL YAZ_A
endif
IF ?0=="p" ;resim için
MOVLW "p"
CALL YAZ_A
MOVLW ?1
CALL YAZ_A
MOVLW "."
CALL YAZ_A
MOVLW "p"
CALL YAZ_A
MOVLW "i"
CALL YAZ_A
MOVLW "c"
CALL YAZ_A
MOVLW "="
CALL YAZ_A
endif
IF ?0=="j" ;durum çubuğu için
MOVLW "j"
CALL YAZ_A
MOVLW ?1
CALL YAZ_A
MOVLW "."
CALL YAZ_A
MOVLW "v"
CALL YAZ_A
MOVLW "a"
CALL YAZ_A
MOVLW "l"
CALL YAZ_A
MOVLW "="
CALL YAZ_A
endif
IF ?0=="z" ;İBRE için
MOVLW "z"
CALL YAZ_A
MOVLW ?1
CALL YAZ_A
MOVLW "."
CALL YAZ_A
MOVLW "v"
CALL YAZ_A
MOVLW "a"
CALL YAZ_A
MOVLW "l"
CALL YAZ_A
MOVLW "="
CALL YAZ_A
endif
ENDM
;/////////////////////////////NEXTION MESAJ BİTİRME SİNYALİ/////////////////////////
NEXT_END MACRO ?0
LOCAL ROT,YAZ_A,SON
GOTO SON
YAZ_A:
MOVWF ADR2
PRINTF ADR2,1
RETURN
SON:
IF (?0=="t")||(?0=="g")
MOVLW 0X22 ; 0x22= " işareti
CALL YAZ_A ; txt ve kayan yazı için
endif ; komut sonuna ve veri sonuna konmalı
MOVLW 0X03 ; nextion veri alma komut kuralı
MOVWF R1 ; t0.txt="AliSümer"0xff0xff0xff
MOVLW 0XFF ; g0.txt="abcdef"0xff0xff0xff
ROT:
CALL YAZ_A
DECFSZ R1
GOTO ROT
ENDM
;NEXTION_READ MACRO ?0,?1
;NEXTION_READ MACRO ?0,?1
NEXTION ekrana veri yazma makroları tüm özellikler dahil edilmedi şu an ama en çok kullanılan komponentlerin verileri yazılabilir oldu.kullanımı hakkında bilgi makro içinde gerekli yerlere not edildi NEXTION ekran tüm komutların ASCII kod karşılığını gönderir ve gene ASCII gelen veriler ile işlem yapar (dikkat ederseniz makroda tüm komutlar da ascii olarak işleniyor) herhangi bir sayıyı gönderdiğinizde ekranda ya hiç birşey göremezsiniz yada eğer gönderdiğiniz yazı komponenti ise sadece ascii karşılığı olan anlamsız sembolleri görürsünüz.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 04 Mayıs 2024, 16:24:41
nextion ekrandan veri göndermek biraz size kalmış birşey o yüzden makro paylaşmayacağım fakat örneğin:
prints "ETE",0 // 0 yazdığımız verinin tamamını alır
prints h0.val,1// 1 ise tek byte gönderir
printh ff // printh hex gönderir
printh ff
printh ff
kodu karşılığında seri kanaldan tanımlama verisi ETE olan ve ardından anlamlı verinin gönderildiği sonunda da 3 tane ff giden bir veri bloğu yollayabilirsiniz bu forumda alışmış olduğumuz veriye daha bir benzer wait "ETE" ile bekleyebilirsiniz örneğin gelecek veriyi; ayrıcanextionun bir de get komutu var ki o da şöyledir ve her kullanılan komponent için bir benzersiz kod üretir içerisinde yapılan işleme ait byte id 4 byte veri ve 3 ff kodu içerir kontrolü daha zordur.aşağıda iki ekrandan MCU ya giden veriyi karşılaştırır bir resim atıyorum (https://i.ibb.co/RGXF4bn/Ads-z.png) (https://ibb.co/RGXF4bn) 71 32 00 00 00 FF FF FF get h0.val sonucu giden 50 verisi 45 54 45 32 FF FF FF prints "ETE",0 ile başlayan kendi tasarladığımız veri formatında 50 verisi tabiki kendi tasarladığımız veriyi MCU tarafında karşılamak daha bir kolay ve sonuna başına koyacağımız süslemelerin uzunluğunu da kendimiz belirleyebiliyoruz.yani progres barın 0-100 arası sınırlandırılmış verisini 4 byte göndermek zorunda değiliz altta da seri olarak bağladım picden gelen veri ve ekrandan pic e giden verinin simulasyon ekranında işlenmesi görülüyor.gelen ve giden verilerin ascii ve hex karşılıkları daha net anlaşılır.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 04 Mayıs 2024, 16:46:42
nextion haberleşmesi için bolca kullanmak zorunda olduğunuz (ASM için) BCD dönüşümü için alttaki mesajda paylaştığım sub.asm dosyasının güncel halini değiştirin ve diğer kapattığım bütün BCD ilişkili kodları açmanız gerekiyor.