(http://profkizilaslan.sitemynet.com/mynet_resimlerim/16f84_9999_devre__emas_.jpg)
arkadaşlar bu 0-9999 sayıcı devresinin elektrik gidip gelse dahi kaldığı sayıyı hafızasında tutmasını en kolay yoldan nasıl sağlarım? lütfen acil yardım ederseniz sevinirim.
picin epromuna sayiyi yazarak saglayabilirsin arkadasim hangi programala dilini kullaniyorsun bilmiyorum ama protonda:
ewrite komutu ve eread komutu var her sayiyi degistiginde eproma kaydetmelisin ve her pic açildiginda eread komutunu kullanip sayiyi ekrana gostermelisin
Alıntı yapılan: "gokhangokcen"picin epromuna sayiyi yazarak saglayabilirsin arkadasim hangi programala dilini kullaniyorsun bilmiyorum ama protonda:
ewrite komutu ve eread komutu var her sayiyi degistiginde eproma kaydetmelisin ve her pic açildiginda eread komutunu kullanip sayiyi ekrana gostermelisin
arkadaşım picte çok çok yeniyim fazla kod bilgim yok ama kodlar bu şekilde ve asm olarak neyi nereye eklemeliyim nasıl bir değişiklik yapmalıyım biraz yardımcı olabilirmisin acaba;
LIST P=16F84A
#include "P16F84A.INC"
__CONFIG _WDT_OFF &_XT_OSC &_PWRTE_ON &_CP_OFF
;
LSB EQU H'0021'
MSB EQU H'0022'
SAYI1 EQU H'0023'
SAYI2 EQU H'0024'
SAYI3 EQU H'0025'
SAYI4 EQU H'0026'
SAYI5 EQU H'0027'
DEGER EQU H'0028'
BIR EQU H'0029'
ON EQU H'002A'
YUZ EQU H'002B'
BIN EQU H'002C'
RAKAM EQU H'002D'
RAKAM1 EQU H'002E'
TEMP EQU H'002F'
;-------------
BASLA
CLRF MSB
CLRF LSB
BSF STATUS,5
MOVLW B'11110000'
MOVWF TRISA
MOVLW B'10000000'
MOVWF TRISB
BCF STATUS,5
CLRF PORTB
CLRF PORTA
CLRF BIR
CLRF ON
CLRF YUZ
CLRF BIN
CLRF SAYI1
CLRF SAYI2
CLRF SAYI3
CLRF SAYI4
GOTO ANA
;-----------
ART
INCF BIR,F
MOVLW .10
SUBWF BIR,W
BTFSS STATUS,Z
GOTO ASON
CLRF BIR
INCF ON,F
MOVLW .10
SUBWF ON,W
BTFSS STATUS,Z
GOTO ASON
CLRF ON
INCF YUZ,F
MOVLW .10
SUBWF YUZ,W
BTFSS STATUS,Z
GOTO ASON
CLRF YUZ
INCF BIN,F
MOVLW .10
SUBWF BIN,W
BTFSS STATUS,Z
GOTO ASON
CLRF BIN
ASON
CALL EKRAN
BTFSS PORTB,7
GOTO ASON
GOTO ANA
;-----------
AZAL
MOVLW .1
SUBWF BIR,F
BTFSC STATUS,C
GOTO ESON
CLRF BIR
MOVLW .1
SUBWF ON,F
BTFSC STATUS,C
GOTO BIR9
CLRF ON
MOVLW .1
SUBWF YUZ,F
BTFSC STATUS,C
GOTO ON9
CLRF YUZ
MOVLW .1
SUBWF BIN,F
BTFSC STATUS,C
GOTO YUZ9
CLRF BIN
GOTO ESON
;----------
YUZ9
MOVLW .9
MOVWF YUZ
ON9
MOVLW .9
MOVWF ON
BIR9
MOVLW .9
MOVWF BIR
ESON
CALL EKRAN
BTFSS PORTA,4
GOTO ESON
GOTO ANA
;-----------
ANA
CALL EKRAN
BTFSS PORTA,4
GOTO AZAL
BTFSS PORTB,7
GOTO ART
GOTO ANA
;----------
EKRAN
MOVLW .5
MOVWF RAKAM
CLRF PORTB
MOVLW .255
MOVWF PORTA
GOSTER
BCF PORTA,0
BSF PORTA,1
BSF PORTA,2
BSF PORTA,3
MOVF BIR,W
CALL TABLO
MOVWF PORTB
CALL GECIKME
CALL GECIKME
CLRF PORTB
BSF PORTA,0
BCF PORTA,1
BSF PORTA,2
BSF PORTA,3
MOVF ON,W
CALL TABLO
MOVWF PORTB
CALL GECIKME
CLRF PORTB
BSF PORTA,0
BSF PORTA,1
BCF PORTA,2
BSF PORTA,3
MOVF YUZ,W
CALL TABLO
MOVWF PORTB
CALL GECIKME
CLRF PORTB
BSF PORTA,0
BSF PORTA,1
BSF PORTA,2
BCF PORTA,3
MOVF BIN,W
CALL TABLO
MOVWF PORTB
CALL GECIKME
DECFSZ RAKAM,F
GOTO GOSTER
RETURN
GECIKME
MOVLW .5
MOVWF MSB
D11
MOVLW .55
MOVWF LSB
D22
DECFSZ LSB,F
GOTO D22
DECFSZ MSB,F
GOTO D11
RETURN
TABLO
ADDWF PCL,F
RETLW h'3F'
RETLW h'06'
RETLW h'5B'
RETLW h'4F'
RETLW h'66'
RETLW h'6D'
RETLW h'7D'
RETLW h'07'
RETLW h'7F'
RETLW h'6F'
RETLW h'77'
RETLW h'7C'
RETLW h'39'
RETLW h'5E'
RETLW h'79'
RETLW h'71'
RETLW h'80'
;-------------------------------------------------------------------
END
üzgünüm ama asm konusunda bilgim yok :(
ASM kodu yazarken dikkat etmen gereken en önemli nokta kodun içinde açıklamalar yapmayı ihmal etmemek. Hatta ben olayı biraz abartarak her satırın yanına bir açıklama yazarım, böylece kodu sadece açıklamaları okuyarak da takip edebilirim.
Bahsettiğim açıklamalar mevcut olmadığı için senin kodu pek anlamadım ama ilk bakışta çok karışık gözüküyor. Ama sanırım her basamağı bir byte'ta saklamışsın. Bence bir byte'a iki basamak sığdırabilirdin, bu durumda BDC formatı denen bir şekilde çalışmış olurdun, yani her basamak için 4 bit. Elbette bu 4 bit hiçbir zaman 9'dan büyük olmayacağı için bunu kontrol etmen gerekirdi ve bu da aslında karmaşık bir işlem sayılır. Fakat eğer 18 serisi bir işlemci kullanırsan onlarda DAW diye bir komut var, bu işi senin yerine yapar. Yapman gereken tek şey BDC formatında iki sayıyı işleme soktuktan sonra (çıkarma işlemi de oluyor mu ondan emin değilim) çıkan sayı W'de olmak şartı ile bu komutu çalıştırman. Yaptığı şey bu:
Alıntı yapılan: "18FXX2 Datasheet"DAW Decimal Adjust W Register
Operation:
If [W<3:0> >9] or [DC = 1] then
(W<3:0>) + 6 → W<3:0>;
else
(W<3:0>) → W<3:0>;
If [W<7:4> >9] or [C = 1] then
(W<7:4>) + 6 → W<7:4>;
else
(W<7:4>) → W<7:4>;
Status Affected: C
Description: DAW adjusts the eight-bit value in
W, resulting from the earlier addition
of two variables (each in
packed BCD format) and produces
a correct packed BCD result.
Burda anlattıklarını belki 16 serisine de uygulayabilirsin. Bu arada, verdiğin bu kodda sorunlu olan yer neresi? Eğer kod doğru çalışıyorsa zaten bu söylediklerimle uğraşmana gerek yok. Yoksa sadece EEPROM'a yazım konusunda mı bilgi istiyorsun?
evet sadece hangi sayıda kaldığını hatırlamasını istiyorum sayacın. kodlar konusunda hiç bilgim yok denecek kadar az. bu hafızada kalma olayını nasıl yapabilirim nereye ne eklersem bu iş olur?
Bence burada yazılım kadar donanımda onemli, elektrigin kesildigini anlamak ve cok kusa bir surede ,kapasiteler daha bosalmadan bilgileri eeproma atma işlemi
anladım ama nasıl yapabilirim bunu o önemli?
Örnek= https://www.picproje.org/main/modules.php?name=Forums&file=viewtopic&p=145803#145803
bence once 877 de eeproma yazmayi bu siteden eeproma yazma diye arattirip bulup ogrendikten sonra her defasinda her rakami eeproma yazarak baslamalisin..