Dijital saat çok yavaş çalışıyor!

Başlatan Alparslanyk, 01 Aralık 2012, 22:50:32

Alparslanyk

Selamün Aleyküm. Arkadaşlar ekte bulunan projem çok yavaş çalışıyor. isisde pıc clock hızını 5 mhz yaptığımda doğru olarak çalışıyor fakat bu seferde lcd busty uyarıları çokça görülüyor aşağıdaki hata mesaj kısmında. ekteki dosyada bütün proje dosyaları mevcuttur. pıc hızını 5mhz  yapmadan olduğu gibi 1mhz olarak bırakıpta projenin olması gerektiği hızda çalışmasını nasıl sağlarım. herhangi bir yardımcı fikiri yada çözümü olan varsa lütfen benimle paylaşsın. Şimdiden teşekkürler.

yazici67

Proje gerektiği hızda çalışıyor. Sol alttaki mesaj sayısını gösteren kutucuk yeşil olduğu sürece simülasyon, gerçek zamanda çalışıyor demektir. Sıkıntı yaratan LCD\'nin çekirdek hızı. Normalde HD44780 çekirdeği 270 MHz frekansa sahip. Yapmanız gereken, gecikmeleri arttırıp, ekran yenilenme frekansını azaltmak. ADC çevrimi sonucu sürekli ekranı yenilemek pek doğru değil. En mantıklısı, en son çevrim sonucu bellekte tutulacak. Yeni ölçüm sonucu ile karşılaştırılacak. Eğer farklı ise, yani ısı değişmiş ise LCD güncellenecek. Değer değişmediğinde sadece saniyede bir zaman güncellenecek.

Alparslanyk


yazici67

#3
Assembly bilginiz gördüğüm kadarıyla yeterli. Yapmanız gereken basit. CBLOCK içinde OncekiOlcum gibi bir değişken belirleyin. ADC ölçümünü yaptığınız yerde sonucu ( ADRESH ve ADRESL ) OncekiOlcum ile karşılaştırın.
Koda gelince; öncelikle tarama işlemini sadece ADC çevrimi bittiğinde veya 1 SN dolduğunda yapın. ISI_OLCUM alt programını düzenledim. Şu an kurulu MPASM derleyicim olmadığından deneyemiyorum. Kodda hatalar olabilir.
;==UYG_29=== (HD44780 UYUMLU) LCD EKRANDA
;=========== LCD ÜST SATIRINDA DIJITAL SAAT (SAAT:DAKIKA:SANIYE)
;=========== LCD ALT SATIRINDA TERMOMETRE UYGULAMASI
;=========== BU UYGULAMADA 16x2 LCD MODÜL KULANILMISTIR


;8-bit interfacing

;Pin Connection from LCD to 16F877
;LCD (pin#) 16F877 (pin#)
;DB7 (14) ----RB7(40)
;DB6 (13) ----RB6(39)
;DB5 (12) ----RB5(38)
;DB4 (11) ----RB4(37)
;DB3 (10) ----RB3(36)
;DB2 (9)------RB2(35)
;DB1 (8) -----RB1(34)
;DB0 (7) -----RB0(33)
;E (6) -------RD6(29)
;RW (5) ------RD5(28)
;RS (4) ------RD4(27)
;Vo (3) ------GND
;Vdd (2) -----+5V
;Vss (1) -----GND


LIST P=16F877A
INCLUDE \"P16F877A.INC\"
__CONFIG h\'3F31\'  ;__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON &
; _XT_OSC & _BODEN_OFF & _LVP_OFF & _CPD_OFF
   

CBLOCK 0x20
     SAY120us ;Delay count (number of instr cycles for delay)
     SAY100us
     SAY1ms
     SAY10ms
     SAY1s
     SAYAC1
     SAYAC2
     SN_L_BASAM
     SN_H_BASAM
     DK_L_BASAM
     DK_H_BASAM
     SAAT_L_BASAM
     SAAT_H_BASAM
     BIRLER_BASAM
     ONLAR_BASAM
     YUZLER_BASAM
     BINLER_BASAM
     SAYI1_L
     HEX_YUKSEK
     HEX_ORTA
     HEX_DUSUK
     STATUS_TEMP
     W_TEMP
OLCUM_L
ENDC

E EQU 0x06 ;RD6
RW EQU 0x05 ;RD5
RS EQU 0x04 ;RD4


ORG h\'00\'
GOTO BASLA
ORG h\'04\'
GOTO KESME_PROG

BASLA         ;BASLANGIÇTA YALNIZCA BIR KEZ ÇALISIR

BSF STATUS,5        ;BANK1\'e geç

MOVLW h\'FF\' ;
MOVWF TRISA ; PORTA GIRIS

movlw 0x00
movwf TRISD ; PORTD ÇIKIS
movwf TRISB ; PORTB ÇIKIS


MOVLW h\'8E\' ;w<- h\'8E\'
MOVWF ADCON1 ; b\'10001110\'   ADFM=1, (PCFG3:PCFG0)=1110 YANI AN0(RA0):ANALOG GIRIS, DIGERLERI DIJITAL I/O


BANKSEL ADCON0 ;BANK0\'A GEÇ
MOVLW h\'81\' ;FOSC/32, A/D MODÜLÜ AÇIK, 0.KANAL SEÇILDI
MOVWF ADCON0 ;
movlw  0x07 ;lcd ekran görüntü vermesi için
movwf  CMCON ;analog çevirici kapatılmalı.



banksel PORTB ; BANK0\'A GEÇ
clrf PORTB
clrf PORTD

;-------------------------------------------------------------
;LCD routine starts

call Delay10ms
call Delay10ms ;give LCD module to reset automatically

               

;Function for 8-bit, 2-line display, and 5x8 dot matrix
movlw 0x38
call komut_yaz   



;Display On, CUrsor off, no blinking
movlw 0x0C         ;0E would nO blinking   ; 0F would blinking
call komut_yaz 



;DDRAM address increment by one & cursor shift to right
movlw 0x06
call komut_yaz



;DISPLAY CLEAR
movlw 0x01
call komut_yaz

;--------------------------------------------------------------

BSF STATUS,RP0 ;BANK1\'E GEÇ
MOVLW   b\'10000000\' ;
MOVWF   OPTION_REG ;


BCF STATUS,5 ;Bank 0\'a geç

CLRF SN_L_BASAM
CLRF SN_H_BASAM
CLRF DK_L_BASAM
CLRF DK_H_BASAM
CLRF SAAT_L_BASAM
CLRF SAAT_H_BASAM

MOVLW h\'00\' ;w<- h\'00\'
MOVWF BIRLER_BASAM ;BIRLER_BASAM <- W
MOVWF ONLAR_BASAM ;ONLAR_BASAM  <- W
MOVWF YUZLER_BASAM ;YUZLER_BASAM <- W
MOVWF BINLER_BASAM ;BINLER_BASAM <- W



MOVLW b\'10100000\' ;INTCON yazmacinin 7.biti (GIE) ve 5.biti (TMR0IE)
MOVWF INTCON ; GIE=on TMR0IE=on (timer0 overflow int)
MOVLW h\'07\' ;
MOVWF HEX_YUKSEK ; HEX_YUKSEK <- h\'07\'
MOVLW h\'A1\'+1 ;
MOVWF HEX_ORTA ; HEX_ORTA <- h\'A1\'+1
MOVLW h\'20\' ;
MOVWF HEX_DUSUK         ; HEX_DUSUK <- h\'20\'
GOTO  ANA_PROG

;=========================================================================
ANA_PROG

BTFSS PORTD,0 ; RD0\'I TEST ET (1 MI?)
GOTO BUTON1_TEST ; HAYIR, 1 SN SÜREDOMADI TERMOMETRE ÖLÇÜMÜ YAPMA
GOTO    TERMO ; EVET, ISI ÖLÇÜMÜ YAP

TERMO
CALL ISI_OLCUMU



BUTON1_TEST ;Dakika artirma butonu (RA1)
CALL TARA_GOSTER        
BTFSC PORTA,1 ;PortA\'nIn 1.biti (RA1) BASILI mI?
GOTO    BUTON2_TEST ;Basili degilse BUTON2_TEST'e git
CALL TARA_GOSTER
 

INCF DK_L_BASAM,F ;DK_L_BASAM=DK_L_BASAM+1,
MOVF DK_L_BASAM,W ;DK_L_BASAM içerigini W'ye yükler
SUBLW h\'0A\' ;W=10-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO SN_SIFIRLA ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF DK_L_BASAM ;DK_L_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.

INCF DK_H_BASAM,F ;DK_H_BASAM=DK_H_BASAM+1,
MOVF DK_H_BASAM,W ;DK_H_BASAM içerigini W'ye yükler
SUBLW h\'06\' ;W=06-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO SN_SIFIRLA ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF DK_H_BASAM ;BINLER_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
CLRF DK_L_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.
GOTO ANA_PROG

SN_SIFIRLA
CLRF SN_L_BASAM
CLRF SN_H_BASAM
GOTO ANA_PROG

BUTON2_TEST ;Saat artirma butonu  (RA2)
BTFSC PORTA,2 ;PortA\'nin 1.biti (RA1) BASILI MI?
GOTO    ANA_PROG ;Basili degilse ANA_PROG\'A git
CALL TARA_GOSTER



INCF SAAT_L_BASAM,F ;SAAT_L_BASAM=SAAT_L_BASAM+1,
BCF STATUS,2

MOVF SAAT_H_BASAM,W ;SAAT_H_BASAM içerigini W'ye yükler
SUBLW h\'02\'         ;W=02-W SAAT_H_BASAM 20-23 arasinda (2 ile basliyorsa
        ;SAAT_L_BASAM  sadece 1,2 ve 3 olabilir yani 21,22 ve 23
        ;SAAT_H_BASAM 00-19 arasinda (0 ya da 1 ile basliyorsa
        ;SAAT_L_BASAM  0-9 arasi deger alabilir
BTFSC STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO SAAT_20_23 ;SAAT_H_BASAM degeri 2
;SAAT_H_BASAM degeri 0 ya da 1 dir

MOVF SAAT_L_BASAM,W ;SAAT_L_BASAM içerigini W'ye yükler
SUBLW h\'0A\' ;W=0A-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO SN_SIFIRLA ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SAAT_L_BASAM ;SAAT_L_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.

INCF SAAT_H_BASAM,F ;SAAT_H_BASAM=SAAT_H_BASAM+1,
MOVF SAAT_H_BASAM,W ;SAAT_H_BASAM içerigini W'ye yükler
SUBLW h\'03\' ;W=03-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO SN_SIFIRLA ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SAAT_H_BASAM ;SAAT_H_BASAM Registere h\'00\' yüklenir

CLRF SN_L_BASAM
CLRF SN_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirla
GOTO ANA_PROG

SAAT_20_23

MOVF SAAT_L_BASAM,W ;SAAT_L_BASAM içerigini W'ye yükler
SUBLW h\'04\' ;W=04-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO SN_SIFIRLA ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SAAT_L_BASAM ;SAAT_L_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
CLRF SAAT_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.


GOTO ANA_PROG


; ISI_OLCUM alt programını bu sekilde degisitirin
;========================================================================

ISI_OLCUMU

BANKSEL ADCON0 ; BANK0\'A GEÇ
BSF ADCON0,2 ; GO BITI 1 YAPILARAK A/D DÖNÜSÜMÜ BASLAT
BTFSC ADCON0,2 ; DÖNÜSÜMÜN TAMAMLANMASINI BEKLE
GOTO $-1

BCF STATUS,C
RRF ADRESH,F

BSF STATUS,RP0 ; BANK1\'E GEÇ,
BCF STATUS,C
RRF ADRESL,W

BCF STATUS,RP0 ; BANK0\'A GEÇ
MOVWF SAYI1_L ; 8-BIT ADRESL D/A ÇIKISINI SAYI1_L YAZMACINA YAZ SAYI1_L <- ADRESL

; W yazmacında ölcüm sonucu var. Bu sonucu eski deger ile karsılastıralım.
; Ne yazik ki PIC cekirdeginde, CMP komutu yok. Bunun icin cikartma isleminden
; faydalanacagiz.

SUBWF OLCUM_L, w ; Onceki olcumden yeni olcumu cikar.
BTFSC STATUS, Z ; Sonuc sifir mi? Oyleyse bir komut atla
GOTO CEVRIM ; Sifir degilse olcum farkli, degeri cevir
RETURN ; Alt programdan cik. Ekrani tarama.


CEVRIM: ; Cevrim gerekli, donusumu yap ve EKRANA DEGERI BURADA BAS
;========== HEX_DEC_CEVRIM  ================

CLRF BIRLER_BASAM
CLRF ONLAR_BASAM
CLRF YUZLER_BASAM
CLRF BINLER_BASAM

ONLAR
BCF STATUS,C

MOVLW h\'0A\' ;w <- h\'0A\'
SUBWF SAYI1_L,W ;W <- (SAYI1_L - 10)
BTFSS STATUS,C ;SONUÇ >= 10 MU?
GOTO BIRLER ;SAYI <10 ISE BIR ETIKETINE GIT VE BIRLER_BASAM DÜZENLE
INCF ONLAR_BASAM,F ;SAYI >= 10 ISE ONLAR_BASAM DEGERINI BIR ARTIR


MOVLW h\'0A\' ;w <- h\'0A\'
SUBWF SAYI1_L,F ; SAYI1_L = SAYI1_L - 10
GOTO ONLAR

BIRLER
MOVF SAYI1_L,W ;W <- SAYI1_L
MOVWF BIRLER_BASAM ;BIRLER_BASAM <- W


;========HEX_DEC_CEVRIM BITTI .....=================

; Ekrana basma alt programini cagir
CALL TARA_GOSTER

RETURN


;==============================
TARA_GOSTER

;------------------------------------------
;DDRAM address DEGERI #0.SATIR IÇIN (00h) OLUP 
;h\'80\' DEGERI EKLENEREK 0x80 ADRESI BULUNUR. DDRAM ADDRESS DEGERINE h\'80\'
; EKLENMESININ NEDENI DDRAM ADRESI YÜKLENIRKEN D7 BITININ \'1\' OLMASI ZORUNLUDUR.
; <D6:D0> BITLERI ISE 1. SATIR BASLANGIÇ EDRESINDEN ELDE EDILMEKTEDIR.

;Set DDRAM ADDRES
movlw 0x80 ;00
call komut_yaz


;ILK SATIRA SAAT VERISINI YAZ

movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz
movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz
movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz
movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz

MOVF  SAAT_H_BASAM,0 ;W<- SAAT_H_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz ; ÇÜNKÜ SAAT_H_BASAM h\'01\' ISE b\'0000 0001\' DIR.
; ASCII TABLOSUNA BAKILDIGINDA 0-9 ARASI TÜM RAKAMLARIN
; 0011 ILE BASLADIGI GÖRÜLÜR.
; BU DURUMDA DESIMAL \'0\' RAKAMI ASCII: 0011 0000
;      DESIMAL \'1\' RAKAMI ASCII: 1011 0001
;      DESIMAL \'2\' RAKAMI ASCII: 1011 0010

; AYNI ISLEM SAAT_L_BASAM, DK_H_BASAM, DK_L_BASAM, SN_H_BASAM, SN_L_BASAM
; IÇIN DE YAPILNAKTADIR.
   

MOVF  SAAT_L_BASAM,0 ;W<- SAAT_L_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz


movlw 0x3A ; IKI NOKTA ÜSTÜSTE  \":\" KARAKTERI
call veri_yaz


MOVF  DK_H_BASAM,0 ;W<- DK_H_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz



MOVF  DK_L_BASAM,0 ;W<- DK_L_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz


movlw 0x3A ; IKI NOKTA ÜSTÜSTE  \":\" KARAKTERI
call veri_yaz




MOVF  SN_H_BASAM,0 ;W<- SN_H_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz



MOVF  SN_L_BASAM,0 ;W<- SN_L_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz


movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz
movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz
movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz
movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz




;Set DDRAM address for the 1st position of line 2 (40h)
movlw 0xC0 ;B\'11000000\'
call komut_yaz ;RS=0

;IKINCI SATIRA  \"SICAKLIK:\" + DEGERI +  \'C\' (SANTIGRAD DERECE ISARETI)  YAZ.

movlw 0x53 ;S
call veri_yaz


movlw 0x49 ;I
call veri_yaz


movlw 0x43 ;C
call veri_yaz


movlw 0x41 ;A
call veri_yaz


movlw 0x4B ;K
call veri_yaz


movlw 0x4C ;L
call veri_yaz


movlw 0x49 ;I
call veri_yaz


movlw 0x4B ;K
call veri_yaz


movlw 0x3A ; IKI NOKTA ÜSTÜSTE  \":\" KARAKTERI
call veri_yaz

movlw 0xA0 ;BOSLUK
call veri_yaz



MOVF  ONLAR_BASAM,0 ;W<- ONLAR_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz


MOVF  BIRLER_BASAM,0 ;W<- BIRLER_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz


movlw 0xA0 ;BOSLUK
call veri_yaz


movlw 0xDF ;0xDF  VE ALT SATIRDAKI 0x43  ascii OLARAK DERECE ISARETI VE \'C\' 
call veri_yaz


movlw 0x43 ;
call veri_yaz


;--------------------------------------------------------------------------------------------------------------
;BU UYGULAMADA 16x2 LCD DISPLAY KULLANILMIS OLUP 20x4 LCD KULLANILSAYDI
;ASAGIDA GÖRÜLDÜGÜ GIBI DDRAM ADRESI ÜÇÜNCÜ SATIRBASI IÇIN 0x14 (0001 0100) ADRESINDEN BASLAMAKTA OLUP
;ADRES YAZMA MODUNDA D7 BITININ \'1\' OLMASI GEREKTIGINDEN, (1001 0100)  ADRESI (0x94) ELDE EDILECEKTIR.
;BURADA ZORUNLU OLARAK D7:1,  <D6:D0> ISE   0x14 (0001 0100) SAYISININ  <D6:D0> BITLERINDEN ALINMISTIR.
; SONUÇ OLARAK HANGI DDRAM ADRES DEGERI ISTENIRSE, TABLODAKI ADRES DEGERINE h\'80\' DEGERI EKLENEREK BULUNABILIR. 


;20x4 SATIR LCD KULLANILISA DDRAM address DEGERI #3.SATIR IÇIN (14h) OLUP 
;h\'80\' DEGERI EKLENEREK 0x94 ADRESI BULUNUR.

;movlw 0x94 ;B\'10010000\'
;call komut_yaz ;RS=0

; \'L\', \'C\', VE \'D\' KARAKTERLERININ 3. SATIRA YAZDIRILMAK ISTENIRSE...

;movlw 0x4C ;L
;call veri_yaz
;movlw 0x43
;call veri_yaz ;C
;movlw 0x44
;call veri_yaz ;D


;20x4 SATIR LCD KULLANILISA DDRAM address DEGERI #4.SATIR IÇIN (54h) OLUP 
;h\'80\' DEGERI EKLENEREK 0xD4 ADRESI BULUNUR.

;movlw 0xD4
;call komut_yaz ;RS=0


; \'D\', \'I\', \'S\', \'P\', \'L\', \'A\', ve \'Y\' KARAKTERLERININ 4. SATIRA YAZDIRILMAK ISTENIRSE...

;movlw 0x44 ;D
;call veri_yaz
;movlw 0x49 ;I
;call veri_yaz
;movlw 0x53 ;S
;call veri_yaz
;movlw 0x50 ;P
;call veri_yaz
;movlw 0x4C ;L
;call veri_yaz
;movlw 0x41 ;A
;call veri_yaz
;movlw 0x59 ;Y
;call veri_yaz
;-------------------------------------------------------------------------------------------------------------
; YAZMA ISLEMI TAMAMLANDI CURSOR BASLANGIÇ POZISYONU OLAN (1. SATIR, 1. SÜTUNA: home position) ALINIR.

movlw 0x02
call komut_yaz

RETURN

;------------------------------------------


;====SUBROUTINES =====
;subroutine \"komut_yaz\" (instruction write)
;instruction to be written is stored in W before the call

komut_yaz
movwf PORTB
bcf PORTD, RS
bsf PORTD, E
bcf PORTD,E
call Delay120us
call Delay120us
return


;subroutine \"veri_yaz\" (data write)
veri_yaz
movwf PORTB
bsf PORTD, RS
bsf PORTD, E

call Delay120us
call Delay120us
call Delay120us
call Delay120us
call Delay120us

bcf PORTD, E      ;Transitional E signal
call Delay120us
return

;
;==========================================================
;DELAY SUBROUTINES

Delay120us
banksel SAY120us
movlw H\'C5\' ;D\'197\'
movwf SAY120us
R120us
decfsz SAY120us
goto R120us
return


;
Delay100us
banksel SAY100us
movlw H\'A4\'
movwf SAY100us
R100us
decfsz SAY100us
goto R100us
return


;
;1ms delay
Delay1ms
banksel SAY1ms
movlw 0x0A ;10
movwf SAY1ms
R1ms
call Delay100us
decfsz SAY1ms
goto R1ms
return


;
;10ms delay
; call 100 times of 100 us delay (with some time discrepancy)
Delay10ms
banksel SAY10ms
movlw H\'64\' ;100
movwf SAY10ms
R10ms
call Delay100us
decfsz SAY10ms
goto R10ms
return



;;
;1 sec delay
;call 100 times of 10ms delay
Delay1s
banksel SAY1s
movlw h\'64\'
movwf SAY1s
R1s
call Delay10ms
decfsz SAY1s
goto R1s
return

;======================================================


;------------------------------------------------------------------------------
KESME_PROG ;
;------------------------------------------------------------------------------
; Ilk olarak w ve status register içeriklerini
MOVWF W_TEMP      ; korumak üzere bu yazmaçlarin içerikleri
MOVF  STATUS,W          ; W_TEMP ve STATUS_TEMP yazmaçlarina
MOVWF STATUS_TEMP      ; aktarilmaktadir.

TSTF HEX_ORTA ; ilk test (HEX_ORTA==0 için)
SKPNZ ;
DECF HEX_YUKSEK,F ;
DECFSZ HEX_ORTA,F ;
;
;
GOTO CIK ;
;
;
TSTF HEX_YUKSEK ;
SKPZ ;
GOTO CIK ;

MOVLW h\'07\' ;
MOVWF HEX_YUKSEK ; HEX_YUKSEK <- h\'07\'

MOVLW h\'A1\' ;
MOVWF HEX_ORTA ; HEX_ORTA <- h\'A1\'

MOVLW h\'20\' ;
ADDWF HEX_DUSUK,F ;
SKPNC ;
INCF HEX_ORTA,F ;

BTFSS INTCON,TMR0IF
GOTO   CIK


BTFSS PORTD,0 ; RD0\'I TEST ET (1 MI?)
GOTO YAK ; HAYIR, RD0\'I YAK
GOTO SONDUR ; EVET, RD0\'I SÖNDÜR

YAK BSF PORTD,0 ; RD0\'I YAK
GOTO CCC

SONDUR  BCF PORTD,0 ; RD0\'I SÖNDÜR


CCC
INCF SN_L_BASAM,F ;SN_L_BASAM=SN_L_BASAM+1,
MOVF SN_L_BASAM,W ;BIRLER_BASAM içerigini W'ye yükler
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.
SUBLW h\'0A\' ;W=10-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SN_L_BASAM ;SN_L_BASAM Registere h\'00\' yüklenir
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.


INCF SN_H_BASAM,F ;SN_H_BASAM=SN_H_BASAM+1,
MOVF SN_H_BASAM,W ;SN_H_BASAM içerigini W'ye yükler
SUBLW H\'06\' ;W=06-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SN_H_BASAM ;SN_H_BASAM Registere h\'00\' yüklenir
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.


INCF DK_L_BASAM,F ;DK_L_BASAM=DK_L_BASAM+1,
MOVF DK_L_BASAM,W ;DK_L_BASAM içerigini W'ye yükler
SUBLW h\'0A\' ;W=10-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF DK_L_BASAM ;DK_L_BASAM Registere h\'00\' yüklenir
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.


INCF DK_H_BASAM,F ;DK_H_BASAM=DK_H_BASAM+1,
MOVF DK_H_BASAM,W ;DK_H_BASAM içerigini W'ye yükler
SUBLW h\'06\' ;W=06-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF DK_H_BASAM ;BINLER_BASAM Registere h\'00\' yüklenir
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.


INCF SAAT_L_BASAM,F ;SAAT_L_BASAM=SAAT_L_BASAM+1,
BCF STATUS,2
MOVF SAAT_H_BASAM,W ;SAAT_H_BASAM içerigini W'ye yükler
SUBLW h\'02\'         ;W=02-W SAAT_H_BASAM 20-23 arasinda (2 ile basliyorsa
        ;SAAT_L_BASAM  sadece 1,2 ve 3 olabilir yani 21,22 ve 23
        ;SAAT_H_BASAM 00-19 arasinda (0 ya da 1 ile basliyorsa
        ;SAAT_L_BASAM  0-9 arasi deger alabilir
BTFSC STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO S_20_23 ;SAAT_H_BASAM degeri 2
;SAAT_H_BASAM degeri 0 ya da 1 dir

MOVF SAAT_L_BASAM,W ;SAAT_L_BASAM içerigini W'ye yükler
SUBLW h\'0A\' ;W=0A-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SAAT_L_BASAM ;SAAT_L_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.

INCF SAAT_H_BASAM,F ;SAAT_H_BASAM=SAAT_H_BASAM+1,
MOVF SAAT_H_BASAM,W ;SAAT_H_BASAM içerigini W'ye yükler
SUBLW h\'03\' ;W=03-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SAAT_H_BASAM ;SAAT_H_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirla
GOTO CIK


S_20_23

MOVF SAAT_L_BASAM,W ;SAAT_L_BASAM içerigini W'ye yükler
SUBLW h\'04\' ;W=04-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SAAT_L_BASAM ;SAAT_L_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
CLRF SAAT_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.


CIK
BCF INTCON,TMR0IF ; TMR0 interrupt bayragini temizle

MOVF STATUS_TEMP,W    ; STATUS registerin kesme programi
MOVWF STATUS          ; öncesindeki içerigini geri yükle
SWAPF W_TEMP,F
SWAPF W_TEMP,W        ; W registerin kesme programi öncesi
                                ; içerigini geri yükle

RETFIE ; interrupt programindan çik
;-----------------------------------------------------------------------

END


ISIS\'in dahili Assembler\'i ile programı düzelttim. Bu son hali. Derlenmiş haliyle ekte...

Alparslanyk

Alıntı yapılan: yazici67 - 02 Aralık 2012, 02:13:14Assembly bilginiz gördüğüm kadarıyla yeterli. Yapmanız gereken basit. CBLOCK içinde OncekiOlcum gibi bir değişken belirleyin. ADC ölçümünü yaptığınız yerde sonucu ( ADRESH ve ADRESL ) OncekiOlcum ile karşılaştırın.
Koda gelince; öncelikle tarama işlemini sadece ADC çevrimi bittiğinde veya 1 SN dolduğunda yapın. ISI_OLCUM alt programını düzenledim. Şu an kurulu MPASM derleyicim olmadığından deneyemiyorum. Kodda hatalar olabilir.
;==UYG_29=== (HD44780 UYUMLU) LCD EKRANDA
;=========== LCD ÜST SATIRINDA DIJITAL SAAT (SAAT:DAKIKA:SANIYE)
;=========== LCD ALT SATIRINDA TERMOMETRE UYGULAMASI
;=========== BU UYGULAMADA 16x2 LCD MODÜL KULANILMISTIR


;8-bit interfacing

;Pin Connection from LCD to 16F877
;LCD (pin#) 16F877 (pin#)
;DB7 (14) ----RB7(40)
;DB6 (13) ----RB6(39)
;DB5 (12) ----RB5(38)
;DB4 (11) ----RB4(37)
;DB3 (10) ----RB3(36)
;DB2 (9)------RB2(35)
;DB1 (8) -----RB1(34)
;DB0 (7) -----RB0(33)
;E (6) -------RD6(29)
;RW (5) ------RD5(28)
;RS (4) ------RD4(27)
;Vo (3) ------GND
;Vdd (2) -----+5V
;Vss (1) -----GND


LIST P=16F877A
INCLUDE \"P16F877A.INC\"
__CONFIG h\'3F31\'  ;__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON &
; _XT_OSC & _BODEN_OFF & _LVP_OFF & _CPD_OFF
   

CBLOCK 0x20
     SAY120us ;Delay count (number of instr cycles for delay)
     SAY100us
     SAY1ms
     SAY10ms
     SAY1s
     SAYAC1
     SAYAC2
     SN_L_BASAM
     SN_H_BASAM
     DK_L_BASAM
     DK_H_BASAM
     SAAT_L_BASAM
     SAAT_H_BASAM
     BIRLER_BASAM
     ONLAR_BASAM
     YUZLER_BASAM
     BINLER_BASAM
     SAYI1_L
     HEX_YUKSEK
     HEX_ORTA
     HEX_DUSUK
     STATUS_TEMP
     W_TEMP
OLCUM_L
ENDC

E EQU 0x06 ;RD6
RW EQU 0x05 ;RD5
RS EQU 0x04 ;RD4


ORG h\'00\'
GOTO BASLA
ORG h\'04\'
GOTO KESME_PROG

BASLA         ;BASLANGIÇTA YALNIZCA BIR KEZ ÇALISIR

BSF STATUS,5        ;BANK1\'e geç

MOVLW h\'FF\' ;
MOVWF TRISA ; PORTA GIRIS

movlw 0x00
movwf TRISD ; PORTD ÇIKIS
movwf TRISB ; PORTB ÇIKIS


MOVLW h\'8E\' ;w<- h\'8E\'
MOVWF ADCON1 ; b\'10001110\'   ADFM=1, (PCFG3:PCFG0)=1110 YANI AN0(RA0):ANALOG GIRIS, DIGERLERI DIJITAL I/O


BANKSEL ADCON0 ;BANK0\'A GEÇ
MOVLW h\'81\' ;FOSC/32, A/D MODÜLÜ AÇIK, 0.KANAL SEÇILDI
MOVWF ADCON0 ;
movlw  0x07 ;lcd ekran görüntü vermesi için
movwf  CMCON ;analog çevirici kapatılmalı.



banksel PORTB ; BANK0\'A GEÇ
clrf PORTB
clrf PORTD

;-------------------------------------------------------------
;LCD routine starts

call Delay10ms
call Delay10ms ;give LCD module to reset automatically

               

;Function for 8-bit, 2-line display, and 5x8 dot matrix
movlw 0x38
call komut_yaz   



;Display On, CUrsor off, no blinking
movlw 0x0C         ;0E would nO blinking   ; 0F would blinking
call komut_yaz 



;DDRAM address increment by one & cursor shift to right
movlw 0x06
call komut_yaz



;DISPLAY CLEAR
movlw 0x01
call komut_yaz

;--------------------------------------------------------------

BSF STATUS,RP0 ;BANK1\'E GEÇ
MOVLW   b\'10000000\' ;
MOVWF   OPTION_REG ;


BCF STATUS,5 ;Bank 0\'a geç

CLRF SN_L_BASAM
CLRF SN_H_BASAM
CLRF DK_L_BASAM
CLRF DK_H_BASAM
CLRF SAAT_L_BASAM
CLRF SAAT_H_BASAM

MOVLW h\'00\' ;w<- h\'00\'
MOVWF BIRLER_BASAM ;BIRLER_BASAM <- W
MOVWF ONLAR_BASAM ;ONLAR_BASAM  <- W
MOVWF YUZLER_BASAM ;YUZLER_BASAM <- W
MOVWF BINLER_BASAM ;BINLER_BASAM <- W



MOVLW b\'10100000\' ;INTCON yazmacinin 7.biti (GIE) ve 5.biti (TMR0IE)
MOVWF INTCON ; GIE=on TMR0IE=on (timer0 overflow int)
MOVLW h\'07\' ;
MOVWF HEX_YUKSEK ; HEX_YUKSEK <- h\'07\'
MOVLW h\'A1\'+1 ;
MOVWF HEX_ORTA ; HEX_ORTA <- h\'A1\'+1
MOVLW h\'20\' ;
MOVWF HEX_DUSUK         ; HEX_DUSUK <- h\'20\'
GOTO  ANA_PROG

;=========================================================================
ANA_PROG

BTFSS PORTD,0 ; RD0\'I TEST ET (1 MI?)
GOTO BUTON1_TEST ; HAYIR, 1 SN SÜREDOMADI TERMOMETRE ÖLÇÜMÜ YAPMA
GOTO    TERMO ; EVET, ISI ÖLÇÜMÜ YAP

TERMO
CALL ISI_OLCUMU



BUTON1_TEST ;Dakika artirma butonu (RA1)
CALL TARA_GOSTER        
BTFSC PORTA,1 ;PortA\'nIn 1.biti (RA1) BASILI mI?
GOTO    BUTON2_TEST ;Basili degilse BUTON2_TEST'e git
CALL TARA_GOSTER
 

INCF DK_L_BASAM,F ;DK_L_BASAM=DK_L_BASAM+1,
MOVF DK_L_BASAM,W ;DK_L_BASAM içerigini W'ye yükler
SUBLW h\'0A\' ;W=10-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO SN_SIFIRLA ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF DK_L_BASAM ;DK_L_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.

INCF DK_H_BASAM,F ;DK_H_BASAM=DK_H_BASAM+1,
MOVF DK_H_BASAM,W ;DK_H_BASAM içerigini W'ye yükler
SUBLW h\'06\' ;W=06-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO SN_SIFIRLA ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF DK_H_BASAM ;BINLER_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
CLRF DK_L_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.
GOTO ANA_PROG

SN_SIFIRLA
CLRF SN_L_BASAM
CLRF SN_H_BASAM
GOTO ANA_PROG

BUTON2_TEST ;Saat artirma butonu  (RA2)
BTFSC PORTA,2 ;PortA\'nin 1.biti (RA1) BASILI MI?
GOTO    ANA_PROG ;Basili degilse ANA_PROG\'A git
CALL TARA_GOSTER



INCF SAAT_L_BASAM,F ;SAAT_L_BASAM=SAAT_L_BASAM+1,
BCF STATUS,2

MOVF SAAT_H_BASAM,W ;SAAT_H_BASAM içerigini W'ye yükler
SUBLW h\'02\'         ;W=02-W SAAT_H_BASAM 20-23 arasinda (2 ile basliyorsa
        ;SAAT_L_BASAM  sadece 1,2 ve 3 olabilir yani 21,22 ve 23
        ;SAAT_H_BASAM 00-19 arasinda (0 ya da 1 ile basliyorsa
        ;SAAT_L_BASAM  0-9 arasi deger alabilir
BTFSC STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO SAAT_20_23 ;SAAT_H_BASAM degeri 2
;SAAT_H_BASAM degeri 0 ya da 1 dir

MOVF SAAT_L_BASAM,W ;SAAT_L_BASAM içerigini W'ye yükler
SUBLW h\'0A\' ;W=0A-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO SN_SIFIRLA ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SAAT_L_BASAM ;SAAT_L_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.

INCF SAAT_H_BASAM,F ;SAAT_H_BASAM=SAAT_H_BASAM+1,
MOVF SAAT_H_BASAM,W ;SAAT_H_BASAM içerigini W'ye yükler
SUBLW h\'03\' ;W=03-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO SN_SIFIRLA ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SAAT_H_BASAM ;SAAT_H_BASAM Registere h\'00\' yüklenir

CLRF SN_L_BASAM
CLRF SN_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirla
GOTO ANA_PROG

SAAT_20_23

MOVF SAAT_L_BASAM,W ;SAAT_L_BASAM içerigini W'ye yükler
SUBLW h\'04\' ;W=04-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO SN_SIFIRLA ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SAAT_L_BASAM ;SAAT_L_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
CLRF SAAT_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.


GOTO ANA_PROG


; ISI_OLCUM alt programını bu sekilde degisitirin
;========================================================================

ISI_OLCUMU

BANKSEL ADCON0 ; BANK0\'A GEÇ
BSF ADCON0,2 ; GO BITI 1 YAPILARAK A/D DÖNÜSÜMÜ BASLAT
BTFSC ADCON0,2 ; DÖNÜSÜMÜN TAMAMLANMASINI BEKLE
GOTO $-1

BCF STATUS,C
RRF ADRESH,F

BSF STATUS,RP0 ; BANK1\'E GEÇ,
BCF STATUS,C
RRF ADRESL,W

BCF STATUS,RP0 ; BANK0\'A GEÇ
MOVWF SAYI1_L ; 8-BIT ADRESL D/A ÇIKISINI SAYI1_L YAZMACINA YAZ SAYI1_L <- ADRESL

; W yazmacında ölcüm sonucu var. Bu sonucu eski deger ile karsılastıralım.
; Ne yazik ki PIC cekirdeginde, CMP komutu yok. Bunun icin cikartma isleminden
; faydalanacagiz.

SUBWF OLCUM_L, w ; Onceki olcumden yeni olcumu cikar.
BTFSC STATUS, Z ; Sonuc sifir mi? Oyleyse bir komut atla
GOTO CEVRIM ; Sifir degilse olcum farkli, degeri cevir
RETURN ; Alt programdan cik. Ekrani tarama.


CEVRIM: ; Cevrim gerekli, donusumu yap ve EKRANA DEGERI BURADA BAS
;========== HEX_DEC_CEVRIM  ================

CLRF BIRLER_BASAM
CLRF ONLAR_BASAM
CLRF YUZLER_BASAM
CLRF BINLER_BASAM

ONLAR
BCF STATUS,C

MOVLW h\'0A\' ;w <- h\'0A\'
SUBWF SAYI1_L,W ;W <- (SAYI1_L - 10)
BTFSS STATUS,C ;SONUÇ >= 10 MU?
GOTO BIRLER ;SAYI <10 ISE BIR ETIKETINE GIT VE BIRLER_BASAM DÜZENLE
INCF ONLAR_BASAM,F ;SAYI >= 10 ISE ONLAR_BASAM DEGERINI BIR ARTIR


MOVLW h\'0A\' ;w <- h\'0A\'
SUBWF SAYI1_L,F ; SAYI1_L = SAYI1_L - 10
GOTO ONLAR

BIRLER
MOVF SAYI1_L,W ;W <- SAYI1_L
MOVWF BIRLER_BASAM ;BIRLER_BASAM <- W


;========HEX_DEC_CEVRIM BITTI .....=================

; Ekrana basma alt programini cagir
CALL TARA_GOSTER

RETURN


;==============================
TARA_GOSTER

;------------------------------------------
;DDRAM address DEGERI #0.SATIR IÇIN (00h) OLUP 
;h\'80\' DEGERI EKLENEREK 0x80 ADRESI BULUNUR. DDRAM ADDRESS DEGERINE h\'80\'
; EKLENMESININ NEDENI DDRAM ADRESI YÜKLENIRKEN D7 BITININ \'1\' OLMASI ZORUNLUDUR.
; <D6:D0> BITLERI ISE 1. SATIR BASLANGIÇ EDRESINDEN ELDE EDILMEKTEDIR.

;Set DDRAM ADDRES
movlw 0x80 ;00
call komut_yaz


;ILK SATIRA SAAT VERISINI YAZ

movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz
movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz
movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz
movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz

MOVF  SAAT_H_BASAM,0 ;W<- SAAT_H_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz ; ÇÜNKÜ SAAT_H_BASAM h\'01\' ISE b\'0000 0001\' DIR.
; ASCII TABLOSUNA BAKILDIGINDA 0-9 ARASI TÜM RAKAMLARIN
; 0011 ILE BASLADIGI GÖRÜLÜR.
; BU DURUMDA DESIMAL \'0\' RAKAMI ASCII: 0011 0000
;      DESIMAL \'1\' RAKAMI ASCII: 1011 0001
;      DESIMAL \'2\' RAKAMI ASCII: 1011 0010

; AYNI ISLEM SAAT_L_BASAM, DK_H_BASAM, DK_L_BASAM, SN_H_BASAM, SN_L_BASAM
; IÇIN DE YAPILNAKTADIR.
   

MOVF  SAAT_L_BASAM,0 ;W<- SAAT_L_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz


movlw 0x3A ; IKI NOKTA ÜSTÜSTE  \":\" KARAKTERI
call veri_yaz


MOVF  DK_H_BASAM,0 ;W<- DK_H_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz



MOVF  DK_L_BASAM,0 ;W<- DK_L_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz


movlw 0x3A ; IKI NOKTA ÜSTÜSTE  \":\" KARAKTERI
call veri_yaz




MOVF  SN_H_BASAM,0 ;W<- SN_H_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz



MOVF  SN_L_BASAM,0 ;W<- SN_L_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz


movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz
movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz
movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz
movlw 0xFF ; IÇI DOLU KARE KARAKTERI
call veri_yaz




;Set DDRAM address for the 1st position of line 2 (40h)
movlw 0xC0 ;B\'11000000\'
call komut_yaz ;RS=0

;IKINCI SATIRA  \"SICAKLIK:\" + DEGERI +  \'C\' (SANTIGRAD DERECE ISARETI)  YAZ.

movlw 0x53 ;S
call veri_yaz


movlw 0x49 ;I
call veri_yaz


movlw 0x43 ;C
call veri_yaz


movlw 0x41 ;A
call veri_yaz


movlw 0x4B ;K
call veri_yaz


movlw 0x4C ;L
call veri_yaz


movlw 0x49 ;I
call veri_yaz


movlw 0x4B ;K
call veri_yaz


movlw 0x3A ; IKI NOKTA ÜSTÜSTE  \":\" KARAKTERI
call veri_yaz

movlw 0xA0 ;BOSLUK
call veri_yaz



MOVF  ONLAR_BASAM,0 ;W<- ONLAR_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz


MOVF  BIRLER_BASAM,0 ;W<- BIRLER_BASAM
IORLW 0x030 ; ILK 4 BIT h\'30\' YANI <D7:D4> 0011 YAPILIYOR.
call veri_yaz


movlw 0xA0 ;BOSLUK
call veri_yaz


movlw 0xDF ;0xDF  VE ALT SATIRDAKI 0x43  ascii OLARAK DERECE ISARETI VE \'C\' 
call veri_yaz


movlw 0x43 ;
call veri_yaz


;--------------------------------------------------------------------------------------------------------------
;BU UYGULAMADA 16x2 LCD DISPLAY KULLANILMIS OLUP 20x4 LCD KULLANILSAYDI
;ASAGIDA GÖRÜLDÜGÜ GIBI DDRAM ADRESI ÜÇÜNCÜ SATIRBASI IÇIN 0x14 (0001 0100) ADRESINDEN BASLAMAKTA OLUP
;ADRES YAZMA MODUNDA D7 BITININ \'1\' OLMASI GEREKTIGINDEN, (1001 0100)  ADRESI (0x94) ELDE EDILECEKTIR.
;BURADA ZORUNLU OLARAK D7:1,  <D6:D0> ISE   0x14 (0001 0100) SAYISININ  <D6:D0> BITLERINDEN ALINMISTIR.
; SONUÇ OLARAK HANGI DDRAM ADRES DEGERI ISTENIRSE, TABLODAKI ADRES DEGERINE h\'80\' DEGERI EKLENEREK BULUNABILIR. 


;20x4 SATIR LCD KULLANILISA DDRAM address DEGERI #3.SATIR IÇIN (14h) OLUP 
;h\'80\' DEGERI EKLENEREK 0x94 ADRESI BULUNUR.

;movlw 0x94 ;B\'10010000\'
;call komut_yaz ;RS=0

; \'L\', \'C\', VE \'D\' KARAKTERLERININ 3. SATIRA YAZDIRILMAK ISTENIRSE...

;movlw 0x4C ;L
;call veri_yaz
;movlw 0x43
;call veri_yaz ;C
;movlw 0x44
;call veri_yaz ;D


;20x4 SATIR LCD KULLANILISA DDRAM address DEGERI #4.SATIR IÇIN (54h) OLUP 
;h\'80\' DEGERI EKLENEREK 0xD4 ADRESI BULUNUR.

;movlw 0xD4
;call komut_yaz ;RS=0


; \'D\', \'I\', \'S\', \'P\', \'L\', \'A\', ve \'Y\' KARAKTERLERININ 4. SATIRA YAZDIRILMAK ISTENIRSE...

;movlw 0x44 ;D
;call veri_yaz
;movlw 0x49 ;I
;call veri_yaz
;movlw 0x53 ;S
;call veri_yaz
;movlw 0x50 ;P
;call veri_yaz
;movlw 0x4C ;L
;call veri_yaz
;movlw 0x41 ;A
;call veri_yaz
;movlw 0x59 ;Y
;call veri_yaz
;-------------------------------------------------------------------------------------------------------------
; YAZMA ISLEMI TAMAMLANDI CURSOR BASLANGIÇ POZISYONU OLAN (1. SATIR, 1. SÜTUNA: home position) ALINIR.

movlw 0x02
call komut_yaz

RETURN

;------------------------------------------


;====SUBROUTINES =====
;subroutine \"komut_yaz\" (instruction write)
;instruction to be written is stored in W before the call

komut_yaz
movwf PORTB
bcf PORTD, RS
bsf PORTD, E
bcf PORTD,E
call Delay120us
call Delay120us
return


;subroutine \"veri_yaz\" (data write)
veri_yaz
movwf PORTB
bsf PORTD, RS
bsf PORTD, E

call Delay120us
call Delay120us
call Delay120us
call Delay120us
call Delay120us

bcf PORTD, E      ;Transitional E signal
call Delay120us
return

;
;==========================================================
;DELAY SUBROUTINES

Delay120us
banksel SAY120us
movlw H\'C5\' ;D\'197\'
movwf SAY120us
R120us
decfsz SAY120us
goto R120us
return


;
Delay100us
banksel SAY100us
movlw H\'A4\'
movwf SAY100us
R100us
decfsz SAY100us
goto R100us
return


;
;1ms delay
Delay1ms
banksel SAY1ms
movlw 0x0A ;10
movwf SAY1ms
R1ms
call Delay100us
decfsz SAY1ms
goto R1ms
return


;
;10ms delay
; call 100 times of 100 us delay (with some time discrepancy)
Delay10ms
banksel SAY10ms
movlw H\'64\' ;100
movwf SAY10ms
R10ms
call Delay100us
decfsz SAY10ms
goto R10ms
return



;;
;1 sec delay
;call 100 times of 10ms delay
Delay1s
banksel SAY1s
movlw h\'64\'
movwf SAY1s
R1s
call Delay10ms
decfsz SAY1s
goto R1s
return

;======================================================


;------------------------------------------------------------------------------
KESME_PROG ;
;------------------------------------------------------------------------------
; Ilk olarak w ve status register içeriklerini
MOVWF W_TEMP      ; korumak üzere bu yazmaçlarin içerikleri
MOVF  STATUS,W          ; W_TEMP ve STATUS_TEMP yazmaçlarina
MOVWF STATUS_TEMP      ; aktarilmaktadir.

TSTF HEX_ORTA ; ilk test (HEX_ORTA==0 için)
SKPNZ ;
DECF HEX_YUKSEK,F ;
DECFSZ HEX_ORTA,F ;
;
;
GOTO CIK ;
;
;
TSTF HEX_YUKSEK ;
SKPZ ;
GOTO CIK ;

MOVLW h\'07\' ;
MOVWF HEX_YUKSEK ; HEX_YUKSEK <- h\'07\'

MOVLW h\'A1\' ;
MOVWF HEX_ORTA ; HEX_ORTA <- h\'A1\'

MOVLW h\'20\' ;
ADDWF HEX_DUSUK,F ;
SKPNC ;
INCF HEX_ORTA,F ;

BTFSS INTCON,TMR0IF
GOTO   CIK


BTFSS PORTD,0 ; RD0\'I TEST ET (1 MI?)
GOTO YAK ; HAYIR, RD0\'I YAK
GOTO SONDUR ; EVET, RD0\'I SÖNDÜR

YAK BSF PORTD,0 ; RD0\'I YAK
GOTO CCC

SONDUR  BCF PORTD,0 ; RD0\'I SÖNDÜR


CCC
INCF SN_L_BASAM,F ;SN_L_BASAM=SN_L_BASAM+1,
MOVF SN_L_BASAM,W ;BIRLER_BASAM içerigini W'ye yükler
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.
SUBLW h\'0A\' ;W=10-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SN_L_BASAM ;SN_L_BASAM Registere h\'00\' yüklenir
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.


INCF SN_H_BASAM,F ;SN_H_BASAM=SN_H_BASAM+1,
MOVF SN_H_BASAM,W ;SN_H_BASAM içerigini W'ye yükler
SUBLW H\'06\' ;W=06-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SN_H_BASAM ;SN_H_BASAM Registere h\'00\' yüklenir
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.


INCF DK_L_BASAM,F ;DK_L_BASAM=DK_L_BASAM+1,
MOVF DK_L_BASAM,W ;DK_L_BASAM içerigini W'ye yükler
SUBLW h\'0A\' ;W=10-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF DK_L_BASAM ;DK_L_BASAM Registere h\'00\' yüklenir
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.


INCF DK_H_BASAM,F ;DK_H_BASAM=DK_H_BASAM+1,
MOVF DK_H_BASAM,W ;DK_H_BASAM içerigini W'ye yükler
SUBLW h\'06\' ;W=06-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF DK_H_BASAM ;BINLER_BASAM Registere h\'00\' yüklenir
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.


INCF SAAT_L_BASAM,F ;SAAT_L_BASAM=SAAT_L_BASAM+1,
BCF STATUS,2
MOVF SAAT_H_BASAM,W ;SAAT_H_BASAM içerigini W'ye yükler
SUBLW h\'02\'         ;W=02-W SAAT_H_BASAM 20-23 arasinda (2 ile basliyorsa
        ;SAAT_L_BASAM  sadece 1,2 ve 3 olabilir yani 21,22 ve 23
        ;SAAT_H_BASAM 00-19 arasinda (0 ya da 1 ile basliyorsa
        ;SAAT_L_BASAM  0-9 arasi deger alabilir
BTFSC STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO S_20_23 ;SAAT_H_BASAM degeri 2
;SAAT_H_BASAM degeri 0 ya da 1 dir

MOVF SAAT_L_BASAM,W ;SAAT_L_BASAM içerigini W'ye yükler
SUBLW h\'0A\' ;W=0A-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SAAT_L_BASAM ;SAAT_L_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.

INCF SAAT_H_BASAM,F ;SAAT_H_BASAM=SAAT_H_BASAM+1,
MOVF SAAT_H_BASAM,W ;SAAT_H_BASAM içerigini W'ye yükler
SUBLW h\'03\' ;W=03-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SAAT_H_BASAM ;SAAT_H_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirla
GOTO CIK


S_20_23

MOVF SAAT_L_BASAM,W ;SAAT_L_BASAM içerigini W'ye yükler
SUBLW h\'04\' ;W=04-W
BTFSS STATUS,2 ;ESIT ise Z biti 1 olacaktir, Z biti 1 mi?
GOTO CIK ;Hayir, henüz son sayiya ulasilmadi,
MOVLW h\'00\' ;Evet son sayiya ulasildi, W=h\'00\' yükle
MOVWF SAAT_L_BASAM ;SAAT_L_BASAM Registere h\'00\' yüklenir
CLRF SN_L_BASAM
CLRF SN_H_BASAM
CLRF SAAT_H_BASAM
BCF STATUS,2 ;STATUS yazmacinin Zero bayragi sifirlanir.


CIK
BCF INTCON,TMR0IF ; TMR0 interrupt bayragini temizle

MOVF STATUS_TEMP,W    ; STATUS registerin kesme programi
MOVWF STATUS          ; öncesindeki içerigini geri yükle
SWAPF W_TEMP,F
SWAPF W_TEMP,W        ; W registerin kesme programi öncesi
                                ; içerigini geri yükle

RETFIE ; interrupt programindan çik
;-----------------------------------------------------------------------

END


ISIS\'in dahili Assembler\'i ile programı düzelttim. Bu son hali. Derlenmiş haliyle ekte...

Öncelikle çok teşekkürler saat kısmı dzenli olarak zaman gecikmesi olmadan çalışıyor. ama termometredeki değer 0 a sabitlenmiş olarak 0 dereceyi gösteriyor. Kendim çözmeye çalışayım şuan görebillirsem inş. Bunca zahmet edip uğraşmışsınız çok teşekkür ederim sorunumu çözdüğünüz için.

Alparslanyk

Kusura bakmayın gecekafasıyla net olarak görememişim proje tam olarak istediğim gibi çalışıyor. Emeğiniz için çok teşekkür ederim ellerinize sağlık. Önceki mesaj için tekrardan çok özür dilerim.

yazici67

Estağfirullah, özür dilemenize gerek yok. Gecenin o vaktinde normal :) Projenin çalışmasına sevindim. Tekrardan kolay gelsin...

Hızlı Yanıt

Not: Bu konu bir moderatör tarafından onaylanmadan görüntülenmeyecektir.

Adı:
E-Posta:
Doğrulama:
Lütfen bu kutuyu boş bırakın:
IRFP250 Nedir:
kısayollar: göndermek için alt+s veya önizleme yapmak için alt+p'ye basın