Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: furkan055 - 07 Kasım 2016, 16:13:21

Başlık: Asm karakteri nasıl sayıya çeviririz
Gönderen: furkan055 - 07 Kasım 2016, 16:13:21
Öncelikle merhaba  2 3 haftadır asm ile uğraşıyorum ama gelişimim aşırı yavaş basit bir sıcaklık ve saat uygulamasını lcdye yazmam söylendi ama sıcaklıgı analog alır dijitale çevirip lcdye atarken harf olarak atıyorum yardımlarınıza ihtiyacım var şekildeki gibidir sistem ve kodları

(https://s22.postimg.cc/74jbo5425/Sorun_1.png) (https://postimg.cc/image/74jbo5425/)

LIST P=16F877A;kullanılcak pic adresimizi tanımladık
INCLUDE "P16F877A.INC";adresleri otomatik tanımlamak için pic kütüphanemizi girdik
RS EQU RB0;lcd mizin rs bacagını rb0 pinine attık
RW EQU RB1;lcdmizin rw pinini picin rb1 pinine tanımladık
E  EQU RB2;lcd mizin enable izin ucunu picimizin rb2 bacagına attık
SAYAC EQU h'20';sayaç için genel amaçlı registarlardan hexa desimel 20. adresine tanımladık


ORG 0X00;programın hangi adresinden başlıyaccgını ayarladık
MOVLW B'00100000';timer sayıcısını aktif yaptık
MOVWF INTCON;timer ile kesme oluşturuyoruz , istediğimiz kadar saydıktan sonra kesme oluşturuyoruz
CLRF PORTA;CLRF PORTA ;port a yı temizledik
CLRF PORTD;CLRF PORTB ; port d yi temizledik
MOVLW B'01000001';yukardaki değeri adcon 0 a yerleştiriliyo
MOVWF ADCON0;analog dijital yetkilendirme pini açık ad çevirici clock frekansı 1/8 , ad çevirme olarak kanal 0 aktif
BSF STATUS,RP0;bank 1 e geçtik
MOVLW B'10000111';7.pin 1 olması pull up görevi görüyo değişişmi algılıyo hesabı
MOVWF OPTION_REG;111 oldugundan 255 e kadar saycak kesme 255 de oluşcak anlamında
MOVLW B'00000000';adcon 1 yazıcısına yüklüyoruz bu değeri
MOVWF ADCON1;sayının yüksek bitleri  adreshye aktarılıyo son 2  bit adresl ye aktarılıyo an0dan an7 ye kadar analog yapıldı
MOVLW B'00000001';tris a nın ilk pini giriş ddiğerleri çıkış olarak ayarlandı
MOVWF TRISA
CLRF TRISD;bankd 1 deki d pinini çıkış yaptık
CLRF TRISB;b pinini çıkış yaptık
BCF STATUS,RP0;bank0 a geçtik portlarda işlem yaptıgımız için
CLRF PORTD;d portunu temizledik 0 gönderdik
CLRF PORTB;b portunu temizledik 0 gönderdik




BASLA           ; Sonsuz döngü başlığı
MOVLW 0x38      ;  LCD 2*16 satır ve 5X7 çözünürlüğünde ayarlama komutu.
CALL LCDAYAR;  bu komutu gönderiyoruz.
CALL GECIKME      ;  lcd komutu işlemesi için zaman tanıyoruz.
MOVLW 0x0E      ;  LCD ekranını ve cursoru açma komutu
CALL LCDAYAR;  LCD ye komutu gönderiyoruz
CALL GECIKME      ;  LCD ye komutu işlemesi için zaman tanıyoruz.
MOVLW 0x01      ;  LCD ekranı temizleme komutu
CALL LCDAYAR;  LCD ye komutu gönderiyoruz
CALL GECIKME      ;  LCD ye komutu işlemesi için zaman tanıyoruz.
MOVLW 0x80;imleci başlangıça aldırdık
CALL LCDAYAR;  LCD ye komutu gönderiyoruz
CALL GECIKME      ;  LCD ye komutu işlemesi için zaman tanıyoruz. 
MOVLW 's'
CALL LCDYAZMA
CALL GECIKME
MOVLW 0x69
CALL LCDYAZMA
CALL GECIKME
MOVLW 'c'
CALL LCDYAZMA
CALL GECIKME  ; BUNDAN SONRASI ZATEN EKRANA YAZDIRMA HARFİ YAZDIRIYORUZ
MOVLW 'a'
CALL LCDYAZMA
CALL GECIKME
MOVLW 'k'
CALL LCDYAZMA
CALL GECIKME
MOVLW 'l'
CALL LCDYAZMA
CALL GECIKME
MOVLW  0x69 ;0x69 zaten hex yapıda önüne birde hex koyamazsın
CALL LCDYAZMA
CALL GECIKME
MOVLW 'k'
CALL LCDYAZMA
CALL GECIKME


BASLA2
BTFSS INTCON,T0IF;kesme oluşunca t0ıf 1 oluyo eğer 1 se bu işlem analog goto atlanır
GOTO BASLA2;sayıcının sayımı bitmediyse bitmesini bekle
BCF INTCON,T0IF;tekrardan kesme yapabilmek için 0 ladık t0ıf i
BSF ADCON0,GO;analog dijital dönüşme başlat
DON
BTFSS PIR1,ADIF ;analog dijital ddönüşüm yapıldıysa burası 1 dir
GOTO DON;analog dijital dönüşüm ypaılmadıysa yapılmasını beklenir
MOVF ADRESH,W;adresh registarına aktarılan deger w registrıyla alınır
CALL LCDYAZMA
CALL GECIKME;daha sonra port b ye dijital değer atanır


Goto BASLA;  Programı en başa dönderiyoruz.




LCDAYAR;lcd ayar yaparken rw=0 olması lazım lcd ye yolluyoruz çünkü rs=0 olmalı komut registerina çalıştıgımız için e=1 yapılmalıkı üst dalgada veri iletilsin
MOVWF PORTD;üstteki ayarları yaptıktan sonra d pininden yollucaklarımız zaten lcd ayarını yaptırır
BCF PORTB,RS;lcd ayarı yapılırken rs pini 0 verilir komut registiri çalşsın diye
BCF PORTB,RW;forwrite yani lcdye biz gönderiyoruz okuma yapsaydık
BSF PORTB,E;amaç izin ucunu high low yapılarak veri gönderimi salansın
CALL GECIKME;hıgh low hızı karışmasın diye gecikme koyduk
BCF PORTB,E;low yaptık veri iletimi bitsin diye 450 ns gecikme kymak şart
RETURN
LCDYAZMA;lcd yazı göndermek için bu fonksyonu çagırcaz 
MOVWF PORTD;Harfdir vs cart curt bunu w registerından alıp portdye yolladık
BSF PORTB,RS;RS biti yazı yazmak için veri registerını aktif ettik
BCF PORTB,RW;lcd nin rw biti for write için 0 olmalı
BSF PORTB,E;Enable pinini aktif edelimki yazı gitsin
CALL GECIKME;450 Nslik aşagıdaki fonksyonu çagırıyoruz karışmasın diye yazılanlar
BCF PORTB,E;PORT B NİN ENABLE ucunu tekrardan low yapıyoruz
GECIKME
MOVLW h'FF';255 Sayısını w registerına yükledik
MOVWF SAYAC;255 sayıısnı sayaça yükledik
TEKRAR;255x4 saykıllık gecikme
NOP;AMAÇ 1 SAYKILLIK ZAMAN KAZANDIRMA F/4 1/F/4=1 Koda ne kadar zaman geçicegi
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ SAYAC,F;255 değerini 1 azaltıyo 0 gelincec goto komutunu atlar
GOTO TEKRAR;TEKRARDAN TEKRARA GEÇTİ SAYAÇ 0 ANINDA BU KOMUT ATLANIR
RETURN

END

Başlık: Ynt: Asm karakteri nasıl sayıya çeviririz
Gönderen: magic_gun - 07 Kasım 2016, 20:18:33

asağıda ,,





;================================== 
;h_byte l_byte ;;; call_b2 bcd

;R0  low nible 10000's
;R1  high nible  1000's  low nible 100's
;R2  high nible    10's  low nible   1's
;==================================


B2_BCD 
bcf     status,c           ; CARRY bit reset
movlw   .16
movwf   count_16
clrf    R0
clrf    R1
clrf    R2
loop16  rlf     l_byte, F
rlf     h_byte, F
rlf     R2, F
rlf     R1, F
rlf     R0, F
;
decfsz  count_16, F
goto    adjDEC
RETLW   0
;
adjDEC  movlw   R2
movwf   FSR
call    adjBCD
;
movlw   R1
movwf   FSR
call    adjBCD
;
movlw   R0
movwf   FSR
call    adjBCD
;
goto    loop16
;
adjBCD  movlw   3
addwf   0,W
movwf   temp
btfsc   temp,3          ; result > 7 ?
movwf   0
movlw   30
addwf   0,W
movwf   temp
btfsc   temp,7          ; result > 7 ?
movwf   0               ; most sig. digit
RETLW   0





adj_lcd

liv_adj_low


movf line_in,w
movwf l_byte
call B2_BCD
movf R1,w
andlw 0x0F
addlw .48
movwf line_iv100
movf R2,w
movwf temp
swapf temp,1
movlw 0x0F
andwf R2,1
andwf temp,1
movf R2,w
addlw .48
movwf line_iv1
movf temp,w
addlw .48
movwf line_iv10


Başlık: Ynt: Asm karakteri nasıl sayıya çeviririz
Gönderen: furkan055 - 07 Kasım 2016, 22:28:56
@magic_gun Hocam biraz daha açıklayıcı yazabilirmisiniz  zahmet olmazsa pek anlıyamadımda
Başlık: Ynt: Asm karakteri nasıl sayıya çeviririz
Gönderen: RaMu - 07 Kasım 2016, 22:52:52
Başta bu iş kafa karıştırıcı gelebilir ama
aslında çok basit.
Zaten işin zor kısmını bitirmişsin, lcd çalışıyor.

Diyelimki elinde 0xFE sayısı var,
bu sayının onluk tabanda karşılığı 254
bunu lcd de göstermek istiyorsan lcd ye data olarak
0x32, 0x35, 0x34
(LCD de göstermek istediğin karakterin ASCII karşılığını gönderiyorsun,
deneme olarak lcd ye 'a' göndermek yerine, 0x41 veya .65 gönderebilirsin,
üçüde aynı şeyin farklı gösterimi)
göndermen lazım,
lcd ye 3 tane karakter gönderiyorsun, 3 farklı byte,
ama senin asıl değerin mcu da 0xFE olarak tek byte da duruyor,
şimdi bu 1 byte 0xFE değerini 3 tane mcu değişkeninde
0x02, 0x05, 0x04
haline getirmen lazım,
işte bunuda @magic_gun hocamın verdiği yöntemlerle yapabilirsin,
anlatım için "hex den BCD ye dönüştürme" konularına bakabilirsin.