Geri Sayıcı ile ilgili basit yanlış??

Başlatan davul42, 30 Mart 2011, 19:42:06

davul42

Arkadaşlar kafam durdu ya...bir yerde çok basit bir hata yapıyorum ama nerde???????
dahili osilatörden pals aldığım projede geri sayaç için kesmeye;

sayac=sayac+1

if sayac=61 then
  saniye=saniye-1
  sayac=0
if saniye=0 then
  saniye=59
  dakika=dakika-1
if dakika=0 and saniye=0 then
  goto anamenu
endif
endif
endif

sayac 03:01 den 03:00 ü atlayarak (görünmeden) 02:59 a geçiyor..ozaman 1 saniye kaybım olmuş olmuyormu yoksa ben bu yaşıma kadar saati yanlışmı öğrenmişim :)...birde sayac 00:00 olduğunda dallandırmak istediğim etikete git diyorum fakat if saniye=0 olduğunda saniye=59 yap dakikayıda " dakika=dakika-1" yap dediğim için dakika:55 saniye:59 diyip geriye saymaya tekrar devam ediyor..e bu seferde son if deki komutu dakika=0,saniye=1 yapmak zorunda kalıyorum bu seferde 00:01 de iken etikete gidiyor...vallaha yardımcı olursanız sevinirim...teşekkür ederim....



Maxim

bu kodtan tahmin etnek zor , geri sayım kodlarını düz mantık interrupt olmadan debug edemiyormusun ?

z

#2
Sayac=Sayac+1

if Sayac=61 then
     Sayac=0 
     Saniye=Saniye-1
endif

if Saniye<0 then
     Saniye=59
     Dakika=Dakika-1
endif

if Dakika<0 then
     Dakika=59
     Saat=Saat-1
endif

if Saat<0 then 
     Saat=23
endif

if (Saat=AlarmSaat) and (Dakika=AlarmDakika) and (Saniye=AlarmSaniye) then
     Rem  Alarm islemleri
     ..........
     ..........
endif


Kodu isini gorur. IF'leri ic ice alarak surekli olarak gereksiz karsilastirmalari engelleyip CPU yukunu azaltabilirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ete

Geriye doğru saat saydırma kolay gibi gözüksede bazı kritik noktaları vardır.
Birincisi Basic de Byte değişkenleri sıfırdan küçük olamazlar. Yani bir değişken  değeri sıfır iken ondan  bir çıkarırsanız değişken 255 değerini alır yani tekrar başa döner. Birinci kritik nota budur. Diğer bir nokta da yaşanmamış zamana dikkat etmek gerekir. Bunun için aşağıdaki kod da senin yazmış olduğun ;
IF Dakika=0 and Saniye=0 then ANAMENU 
komut satırına bakmanı öneririm.
Önce senin kod ile ilgili hatayı Bunalmış açıklamış Oraya değinmeyeceğim. Ben olması gerekeni yazacağım.
IF SAYAC=61 then
  sayac=0 
  Saniye=Saniye-1
  if saniye=255 then  'işte bu komut aslında sizin if saniye<0 komutuna karşılık gelmektedir.!!!!!!!!!!!!!
     saniye=59
     Dakika=Dakika-1
     IF Dakika=0  then ANAMENU  'burada saniye zaten 59 olduğu için yalnızca dakika değerine bakıyoruz.
  ENDIF

Saniyenin sıfır olması durumunda saymayı kesersen 1 saniyelik süreyi saymamış olacaksın. Bu nedenle komutu yukarıdaki şekilde yazdım.
Saniyenin önce sıfır olması ve 1 saniye sonrada yeniden 59 za dönmesi gerekir.  Kısaca sıfırıncı saniyede bir zaman dilimidir ve o anı yaşaman gerekir. Bir dakika=60 saniye olduğuna göre sen aslında 0-59 (sıfır dahil 60 saniye) arası saniye zamanı geçirerek 1 dakikalık bir sürenin geçmesini sağlıyorsun. Ama bu komut ile aslında 59 saniyelik (sıfır hariç olduğu için) bir süreyi saymış ve geçirmiş oluyorsun. Buna sıfırncı saniyeyide eklemelisin.
Kısaca orada yer alan komut;
IF Dakika=0 and Saniye=0 then ANAMENU
yerine
IF Dakika=0 and Saniye=59 then ANAMENU şeklinde olmalı ve komut içinde saniye zaten 59 olacağı için yalnızca dakika değerine bakıp saymayı sonlandırıyoruz.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

davul42

eyvallah sağolun arkadaşlar..bütün sorunların tek nedeni varmış oda ete hocamında bahsettiği gibi byte değişkenin 0 dan küçük olamıyacağıdır...eğer öyle bir eylem yaparsa programda değişkenin 0-255 döngüsüne gireceğidir...

o zman ete hocam örnekteki dakika=0 şartını dakika=255 yapmamızda gerekmiyormu????


IF SAYAC=61 then 
sayac=0 
Saniye=Saniye-1
if saniye=255 then  'işte bu komut aslında sizin if saniye<0 komutuna karşılık gelmektedir.!!!!!!!!!!!!!     saniye=59     
Dakika=Dakika-1     
IF Dakika=0  then   'ozaman burdada dakikayıda 255 yapmamız gerekiyor..saniye<0,dakika<0 olduğu anda
delayms 500
GOTO ANAMENU      anamenuye git
ENDIF
ENDİF
ENDİF