Saat Projesi

Başlatan Sıfır, 25 Temmuz 2015, 20:47:31

Sıfır

Basit bir saat yapmak istiyorum ama kodlardan emin olamadım.
Kod:
'SİGORTA AYARLARI
  'PİC AYARLARI
  'LCD AYARLARI
 
TRISA=0
TRISB=0
 
PORTA=0 
PORTB=0

LOW PORTB.2
CMCON=7
 
SAAT VAR BYTE
DAKIKA VAR BYTE
SANIYE VAR BYTE

SAAT=0
DAKIKA=0
SANIYE=0

$FE,1
PAUSE 200

BASLA:
FOR A = 0 TO 5
PAUSE 200
LCDOUT $FE,1,#SAAT,":",#DAKIKA
SANIYE=SANIYE+1
IF SANIYE=60 THEN GOTO BASLA2
ELSE
GOTO BASLA
IF A=5 AND DAKIKA<61 THEN
SANIYE=SANIYE+5
GOTO BASLA
ENDIF
ENDIF

BASLA2:
IF SANIYE=60 THEN
DAKIKA=DAKIKA+1
SANIYE=0
PAUSE 200
LCDOUT $FE,1,#SAAT,":",#DAKIKA
IF DAKIKA=60 THEN GOTO BASLA3
ELSE GOTO BASLA
ENDIF
ENDIF

BASLA3:
IF DAKIKA=60 THEN
SAAAT=SAAT+1
DAKIKA=0
PAUSE 200
LCDOUT $FE,1,#SAAT,":",#DAKIKA
IF SAAT=24 THEN GOTO BASLA4
ELSE GOTO BASLA
ENDIF
ENDIF

BASLA4:
IF SAAT=24 THEN
SAAT=0
DAKIKA=0
PAUSE 200
ENDIF
NEXT A
END


Sigorta ayarlarının vb. ayarlayacağım.Kodun nereleri hatalı söylerseniz sevinirim.

ete

Bu kodun hatasız bir yeri yok maalesef.
Sigorta ayarı yok. Bunun için ,
http://etepic.com/index.php/topic,1687.0.html 
linkinde açıklanmış konuyu dikkatlice okuyun.

İşlemci nin ne o lduğu belli değil böylece o işlemciye ait özel register tanımlaması gerekli mi oda belli değil.

LCD nereye bağlı belli değil ve LCD nin Port ve pin tanımlamaları eksik.
Bunlar için;
http://etepic.com/index.php/topic,1361.0.html   linkinde verilen Basic derlerini okuyup öğrenmen gerekiyor.
Ayrıca orada yer alan diğer dersleride indirip teker teker çalışsan hiç fena olmayacak.

Basit saat yapılması konusunda aşağıdaki projeyi de incelersen yardımcı olacaktır.
http://etepic.com/index.php/topic,72.0.html

Ayrıca yapmaya çalıştığın saat'e benzer bir projemde olacak idi. Onuda aşağıdaki saat projeleri içinde görebilirsin.
http://etepic.com/index.php/topic,71.0.html

Ete

Sıfır

Alıntı yapılan: ete - 26 Temmuz 2015, 09:38:56
Bu kodun hatasız bir yeri yok maalesef.
Sigorta ayarı yok. Bunun için ,
http://etepic.com/index.php/topic,1687.0.html 
linkinde açıklanmış konuyu dikkatlice okuyun.

İşlemci nin ne o lduğu belli değil böylece o işlemciye ait özel register tanımlaması gerekli mi oda belli değil.

LCD nereye bağlı belli değil ve LCD nin Port ve pin tanımlamaları eksik.
Bunlar için;
http://etepic.com/index.php/topic,1361.0.html   linkinde verilen Basic derlerini okuyup öğrenmen gerekiyor.
Ayrıca orada yer alan diğer dersleride indirip teker teker çalışsan hiç fena olmayacak.

Basit saat yapılması konusunda aşağıdaki projeyi de incelersen yardımcı olacaktır.
http://etepic.com/index.php/topic,72.0.html

Ayrıca yapmaya çalıştığın saat'e benzer bir projemde olacak idi. Onuda aşağıdaki saat projeleri içinde görebilirsin.
http://etepic.com/index.php/topic,71.0.html

Ete
Yorumunuz için teşekkür ederim hocam ama kısıtlı bir şekilde kodu yazdım sadece ve bundan dolayı da sigorta ayarlarını vb. ekleyemedim.Bu sebeple de kesme işareti koyarak yerlerini belirttim.Konunun sonunda da bunları ekleyeceğimi yazdım zaten.
Saat projeleri için de teşekkürler evet bazı derslerinizi tekrar etmem gerekiyor haklısınız.
Kodun yazılımında bir hata var mı ondan emin olamadım.For-Next konusunda şüpheliyim.

ete

Anlaşıldı uzun uzadıya açıklama bekliyorsun. Buyur açıklama;

$FE,1
şeklinde bir satırın var böyle bir komut yok. LCDOUT kısmı eksik.

Saat uygulaması için süresi 1 sn olan saniye pulslerine ihtiyaç vardır. Sen bunu 5 adet PAUSE 200 ile sağlamaya çalışmışsın. Ancak saniye değerini her 200 ms de bir artırarak hata yapmışsın. Halbuki 5 adet 200 ms lik gecikme bittikten sonra 1000 ms geçmiş olur ve o zaman saniye değeri bir artırılmalıdır.
Burada neden 5 adet 200 ms gecikme kullanılmış orasıda bir muamma. Zira oraya döngü kurmadan direk pause 1000 desen ve ardından hem SN değerini artırsan hemde saat bilgisini ekrana vermiş olsan daha doğru olabilirdi.

Saniye değeri 1 artırıldıktan sonra şayet SN=60 olmuş ise program BASLA2 ye gidecek. Olmamış ise GOTO BASLA komutu ile program yeniden döngü kurmaya gidecek. Döngüyü sona erdirip yeniden başlatıryorsun. Bu tabiiki yanlış bir uygulama. Bu Döngü devam etmeli ama zaten yanlış bir kod uygulaması olduğu için şöyle olmalı böyle olmalı demek pek uygun olmayacak.
Burada hataları ortaya çıkardığımıza göre bir başka hata da ELSE den sonra GOTO BASLA satırından sonra yaılmış satırlara programın hiç bir zaman ulaşamayacak olmasıdır. Zira program GOTO BASLA satırı ile Basla etiketine gidecek ve dolayısıyla;
IF A=5 AND DAKIKA<61 THEN
SANIYE=SANIYE+5
GOTO BASLA
satırları hiç bir zaman işletilmeyecektir. Bunları oraya yazmanın hiç bir anlamı yok anlayacağın.

BASLA2 isimli satıra yukarıdan zaten SAN=60 olduğu için gelmiş isen, orada tekrar IF SN=60 then demeninde bir alemi yok bence. Zaten SN=60 olduğu için oraya geldin. Tabiiki bunu yapmaktaki amacın programları birer alt program şeklinde değil iç içe sokulmuş programlar şeklinde yazmışsın. Ama yinede programın BASLA2 satırına ulaşabilmesi için saniye değerinin 60 olması gerekiyor.
Orada Dakika değerini bir artırdıktan sonra neden birde Pause 200 koyuyorsun. Bu ekstradan 200 ms lik bir gecikme yaratıp zaman sayımını şaşırtacaktır. gecikmeye gerek varmı sence? Bence yok.
Benzer hatalar diğer etiketler altında da yaılmış durumda. Zaman sayma hasas bir zamanlama gerektirir. her 1000 ms bir sn ye ye eşittir ve bundan fazlası program içinde yer almamalıdır.

BASLA1-2-3-4 isimli etiketler bana göre For-next döngüsü dışına çıkartılmalı ve oralara gosub ile gidilip return ile dönülmelidir.
Böylece for next döngüsü kesintisiz ve sorunsuz çalışabilecektir.

Umarım açıklamalarım yararlı olmuştur.

Ete

Sıfır

Sağolun Ete Hocam.Haklısınız program çok bozuk ama uğraşıyorum.
Pause 200'leri LCD 'de bir sorun olmasın diye eklemiştim.For-Next'i de onun için ekledim zaten her beş turda bir gecikmeyi tamamlasın diye.Olmamış demek.
Programı düzelteceğim İnşaAllah .Yardımınız için teşekkürler.

Powered by EzPortal