avatar_elektro77

Bir cihazın kaç kere açılıp kapandığını sayma algoritması

Başlatan elektro77, 28 Ağustos 2024, 18:03:33

elektro77

Bir tasarımımda cihazın kaç kere açılıp kpandığını saymak istedim.
Aşağıdaki kodları yazdım. Parçalar halinde ekledim. 
Fakat epromu her okuduğumda ekranda aynı değerler çıkıyor. Sebebi ne olabilir. F877A da Eprom bozuk olabilirmi şüphesine kapılıyorum. 
Ya da algoritmam da mı bir hata var?

TOTAL_TIME VAR word  :'TOTAL_TIME=0 :WRITE 0,TOTAL_TIME:PAUSE 10:READ 0,TOTAL_TIME
'DATA@0, 0,0,0,0,0,0,0,0,0,0,0
IF TOTAL_TIME=65535 THEN TOTAL_TIME=0
TOTAL_TIME=TOTAL_TIME+1
WRITE 0,TOTAL_TIME.BYTE1,TOTAL_TIME.BYTE0:PAUSE 10

READ 0,TOTAL_TIME.BYTE1,TOTAL_TIME.BYTE0

Basla:
IF MENU=1 THEN 
B=0:BL=1:LCDOUT $FE,1:PAUSE 300 
GOTO MENUU
ENDIF 

Goto Basla
'-------------------------------------
MENUU:
IF MENUUP=1 THEN
SYC=SYC-1 
WHILE MENUUP=1:WEND
IF SYC=255 THEN SYC=0
ENDIF

IF MENUDOWN=1 THEN
SYC=SYC+1
WHILE MENUDOWN=1:WEND
IF SYC=6 THEN SYC=5
ENDIF

goto DURUM
GOTO MENUU


DURUM:
SELECT CASE SYC
'///////////////////////////////////
CASE 0
lcdout $fe,$80,"1                "
lcdout $fe,$c0,"LANGUICH         "
   IF MENU=1 THEN
   LCDOUT $FE,1:PAUSE 100  
   GOTO LANGUICH
   WHILE MENU=1:WEND
ENDIF 
'///////////////////////////////////
CASE 1
lcdout $fe,$80,"2                "
lcdout $fe,$c0,"INFO             "
IF MENU=1 THEN
   LCDOUT $FE,1:PAUSE 100  
   GOTO INFO
   WHILE MENU=1:WEND
ENDIF 
'///////////////////////////////////

INFO:
READ 0,TOTAL_TIME.BYTE1,TOTAL_TIME.BYTE0

lcdout $fe,$80,"T.TIME:",#TOTAL_TIME," HRS"
lcdout $fe,$c0,"VERS  :UMT_1.4     "

IF EXXIT=1 THEN 
WHILE EXXIT=1:WEND
LCDOUT $FE,1:PAUSE 100
GOTO DURUM
ENDIF


"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

aRci

Merhaba c'den pek anlamıyorum fakat bana göre önce epromdan veriyi alıp sonra kıyaslayıp ardından sayacı artırıp hafızaya yazmalısınız. Kendimce ekleme yaptım.

TOTAL_TIME VAR word  :'TOTAL_TIME=0 :WRITE 0,TOTAL_TIME:PAUSE 10:READ 0,TOTAL_TIME
'DATA@0, 0,0,0,0,0,0,0,0,0,0,0

READ 0,TOTAL_TIME.BYTE1,TOTAL_TIME.BYTE0

IF TOTAL_TIME=65535 THEN TOTAL_TIME=0
TOTAL_TIME=TOTAL_TIME+1
WRITE 0,TOTAL_TIME.BYTE1,TOTAL_TIME.BYTE0:PAUSE 10
 
READ 0,TOTAL_TIME.BYTE1,TOTAL_TIME.BYTE0

ete

Anlaşılan asıl programı epeyce bir kırptıktan sonra buraya program diye koymuşsun.
Ne yazıkki bu hali ile o program çalışmaz. Bunun bir sürü sebebi var.
En başta register ayarları yok. Sonra sigorta ayarları yok. Sonra program hangi OSC ile çalışıyor ve hızı belli değil.
Değişken tanımlamaları yok. Tuş tanımlamaları yok.
Ekrana bir şey yazdırabilmek için hızlı bir şekilde tuş basımı yapılmalı yoksa program daha hızlı bir şekilde anlamsız şekilde sonlanıyor.
LCD tanımlamaları yok. Kim nereye bağlı belli değil.
Bu yok şu yok listesi gittikçe daha da uzayacak. Şimdi diyeceksinki sizi ilgilendirmeyen yerleri koymadım. İyi yaptın da onlar olmadan bir algoritma takibi bile yapmak zor.
Söyleyeceğim tek şey;
Programın başında yer alan,
    IF TOTAL_TIME=65535 THEN TOTAL_TIME=0
    TOTAL_TIME=TOTAL_TIME+1
    WRITE 0,TOTAL_TIME.BYTE1,TOTAL_TIME.BYTE0:PAUSE 10
   
    READ 0,TOTAL_TIME.BYTE1,TOTAL_TIME.BYTE0
komut satırlarının her program çalışmasında bir kereliğine bu satırları çalıştırıp Total_Time isimli değişken değerini 1 artıracağı kesin. Ama bir terslik olduğunuda söylemeden geçemiyeceğim.
Program ilk çalışmada ;
IF TOTAL_TIME=65535 THEN TOTAL_TIME=0
komut satırını görecektir. Total_Time isimli değişken değeri açılışta rastgele değer alır.
Bunu önlemek için önce eprom okutulması gerekir. Yani önce;
READ 0,TOTAL_TIME.BYTE1,TOTAL_TIME.BYTE0
komut satırı çalıştırılmalıdır. Eproma herhangi bir kayıt yapılmadı ise okunan değer Total_Time=65535 olacaktır. İşte burada hemen diğer satır sıraya girmeli;
IF TOTAL_TIME=65535 THEN TOTAL_TIME=0
böylece okunan değer 65535 ise Total_Time=0 olacaktır.
Bu aşamadan sonra Total_Time=Total_Time+1 komutu eklenirse değer bir artırılmış olacaktır.
Bundan sonra artırılan değer eproma geri kayıt edilir.
Write 0,Total_Time.Byte1,Total_Time.Byte0:Pause 10
işte doğru sıralama böyle olmalıydı.
Hatan burada.

Ete

elektro77

Hocam, programin bu kadarindan bile sorunu anlayacağınızi biliyordum. Keza programın tamamı çok uzundu. Vakit almak veya kafa karistirmak istemedim.  Bu cevap benim için yeterli. İstediğim cevabı aldım.
Teşekkür ederim.
EDİT:
Yazdıklarınızı uyguladım. Proğram çalıştı. Dediğiniz gibi ilk sırada epromu okumalıymışım.
Tekrar teşekkürler.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Powered by EzPortal