9999-0 Geri sayıcı

Başlatan dijital74, 28 Ağustos 2012, 18:27:36

dijital74

Merhaba 4 lü ortak anot display ve 16f84a ile basit bir geri sayım düzeneği yaptım. Tatildeyim ,o yüzden simülasyonla kaldı. Simülasyonda display haneleri yürüyor gibi görünüyor. Yazdığım programda hata var mı acaba ?  Kodlar şöyle;

birler var porta.3
onlar  var porta.2
yuzler var porta.1
binler var porta.0
sayac  var word
D1000 var byte
D100  var byte
D10   var byte
D1    var byte
i     var byte
trisa=0
trisb=0
sayac=9999
binler=0
birler=0
onlar=0
yuzler=0

basla:
for sayac=9999 to 0 step -1

    D1000 = sayac / 1000
    D100 = (sayac // 1000) / 100
    D10 =  ((sayac // 1000) // 100 ) / 10
    D1 = (((sayac // 1000) // 1000 ) // 10 )

    for i=1 to 5 step 1
        toggle binler
        portb= D1000
        pause 50

        toggle binler
        toggle yuzler
        portb = D100
        pause 50

        toggle yuzler
        toggle onlar
        portb = D10
        pause 50

        toggle onlar
        toggle birler
        portb= D1
        pause 50
        toggle birler
    next i
    

next sayac 

goto basla



subram

merhaba hocam

display taramada timer interup kullanmak her kesmede sıradaki digiti aktif etmek daha sağlıklı oluyor.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

ete

Pause degerlerini 50 değil 5 yapıp bir deneyin.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

homer380

basamak değerlerini bölme ile değilde DIG komutu ile bulsan daha az kod yer kaplar.

ete

Sayı basamaklarını kolyca bulmak için basicde Dig yani Digit komutu kullanılır . Şekil ise şöyledir.
D1=Sayac Dig 0
D10=Sayac Dig 1
D100=SayacDig 2
D1000=Sayac Dig 3

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

dijital74

#5
Gecikmeyi 5 ms'ye çekince simülasyonda herhangi bir problem kalmadı. Tabii 1sn saydırmak için for döngüsünü 5 den 50 ye çıkardım. Yardımlar için teşekkürler.

Bu arada dig deyimini biliyordum ama tam emin olamadığım için bölme ve mod bulma fonksiyonunu kullandım.

Edit: Timer Interrupt için biraz daha dersime çalışmam lazım. Bugüne kadar hiç o işe girmedim. Ama bir gün mecbur kesme kullanacağız.

subram

şuan için sadece ekrana değer gönderince problem olmaz ama ilerde farklı işler de yaptırıp aynı  zamanda değer göstermek isterseniz bu sorunu aşamazsınız. o yüzden çok fazla erteleme bu işi :D
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

dijital74

#7
Tabii ki haklısınız. Bu arada dijitler ve segmentleri tek bir porta taşıdım. Maskeleme yöntemi ile segmentleri bozmadan dijitleri seçebiliyorum. Süre bitiminde de bir ledi yakacak. Geri sayımda sayının başındaki 0'ları da yok edecek şekilde programı geliştirdim.  Saatli bomba gibi düşünebiliriz bu devreyi ...

Kodların son hali

sayac var word
D1000 var byte
D100  var byte
D10   var byte
D1    var byte
i     var byte
trisa=%00011
trisb=0
porta.2 = 0
sayac=0

for sayac = 9999 to 0 step -1
    for i = 1 to 50 step 1
        
        D1000 = sayac dig 3
        D100  = sayac dig 2
        D10   = sayac dig 1
        D1    = sayac dig 0
        
        portb = %10000000 | D1000
        if D1000 = 0 then portb.7 = 0
        pause 5

        portb = %01000000 | D100
        if D1000 = 0 and D100 = 0 then portb.6 = 0
        pause 5

        portb = %00100000 | D10
        if d1000 = 0 and D100 = 0 and D10 = 0 then portb.5 = 0
        pause 5

        portb = %00010000 | D1
        pause 5
     
     next i
next sayac       
    

 
porta.2=1
end


Gitgide güzelleştiriyorum sanki. @Ete hocam bana not verin :)