TMR0 kesmesi ile zamanlayıcı sapmalar var

Başlatan bahdiyarusta, 09 Şubat 2015, 21:12:13

bahdiyarusta

merhabalar,

ete hocanın derslerinden okuyarak tmr0 kesmesini az çok öğrendiğimi düşünerek bir zamanlayıcı yaptım,
fakat sistem olması gerektiği gibi çalışmıyor yanlışlarım mutlaka var ama göremiyorum. tmr0 konusunda çok acemiyim programa bakış açımda yanlış olabilir ama genel olarak bakınca sistem çalışması istediğim gibi çalışıyor ekran olsun sayma olsun problemsiz.    kristalim 4 mhz dahili işlemcim 628a kodlarım ve isis devrem ekteki gibi,
kesme sayacını telefonun geri sayıcısı ile 15sn den geri saydırarak kalibre ettim düz bir mantık olabilir ama doğru olduğunu kabul ederek devam ettim. sonuç olarak sayac değerini belirledim ve saymaya başlattım 15sn den geri sayınca şaşma yok ama 1dk 3sk  5dk artırınca değerler de sapıyor ve teledon saati ile arasında 4-8sn zaman farkı oluyor,
olay bu,
yardımlarınızı bekliyorum,
teşekkürler.


@ DEVICE pic16F628A                      'i?lemci 16F628A                               
@ DEVICE pic16F628A, WDT_OFF              'Watch Dog timer açyk
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açyk
@ DEVICE pic16F628A, PROTECT_ON         'Kod Protek kapaly
@ DEVICE pic16F628A, MCLR_OFF            'MCLR pini kullanylMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanylacak

DEFINE OSC 4
TRISA=%11111111   
TRISB=%00000000
CMCON=7
SAYAC VAR WORD 'EKRANA RENKLERI YAZMAK ICIN KULLANILDI
SAYAC1 VAR WORD 'DK
SAYAC2 VAR WORD 'SN
DEGER VAR BYTE
'*****LCD TANIMLAMALARI*****
DEFINE LCD_DREG     PORTB       'LCD DATA BACAKLARI PORTB YE BAĞLI
DEFINE LCD_DBIT     4           'LCD DATA BACAKLARI PORTB.4 DEN BAŞLIYOR
DEFINE LCD_RSREG    PORTB       'LCD RS BACAĞI PORTB YE BAĞLI
DEFINE LCD_RSBIT    0           'LCD RS BACAĞI PORTB.1 BAĞLI
DEFINE LCD_RWREG    PORTB       'LCD RW BACAĞI PORTB YE BAĞLI
DEFINE LCD_RWBIT    1           'LCD RW BACAĞI PORTB.2 BAĞLI
DEFINE LCD_EREG     PORTB       'LCD ENABLE BACAĞI PORTB YE BAĞLI
DEFINE LCD_EBIT     2           'LCD ENABLE BACAĞI PORTB.3 BAĞLI
DEFINE LCD_LINES    4           'LCD 4 SATIRLI
DEFINE LCD_BITS     4           'LCD 4 BİT VERİ ALIŞ VERİŞİ YAPIYOR
PORTA=0
PORTB=0
SAYAC1=0
SAYAC2=0
DEGER=0
SYMBOL START=PORTA.0
SYMBOL ARTIR=PORTA.1
SYMBOL AZALT=PORTA.2

OPTION_REG=%10000101 'Pull  up dirençleri İPTAL- Bölme oranı 1/64.

INTCON=%10100000 'Kesmeler  aktif ve TMR0 kesmesi aktif

TMR0=0

LCDOUT $FE,1,  "     ZAMANI      "     
LCDOUT $FE,$C0,"    AYARLAYIN    "
   PAUSE 1500 
BASLA:
     LCDOUT $FE,1,"-> DAKIKA:",#SAYAC1,"dk"
     LCDOUT $FE,$C0,"SANIYE:",#SAYAC2,"sn"
     PAUSE 150                   
     IF SAYAC1<24 AND ARTIR=1 THEN SAYAC1=SAYAC1+1   
     IF SAYAC1>0 AND AZALT=1 THEN SAYAC1=SAYAC1-1
     IF START=1 THEN
     WHILE START=1:WEND
     GOTO SANIYE
     ENDIF
     GOTO BASLA
SANIYE:
     LCDOUT $FE,1,"DAKIKA:",#SAYAC1,"dk"
     LCDOUT $FE,$C0,"-> SANIYE:",#SAYAC2,"sn"
     PAUSE 150                   
     IF SAYAC2<60 AND ARTIR=1 THEN SAYAC2=SAYAC2+1   
     IF SAYAC2>0 AND AZALT=1 THEN SAYAC2=SAYAC2-1
     IF START=1 THEN
     WHILE START=1:WEND
     GOTO KAYDET
     ENDIF
     GOTO SANIYE
KAYDET:
     LCDOUT $FE,1,  "     ZAMAN       "
     LCDOUT $FE,$C0,"  KAYDEDILIYOR..."
     PAUSE 1000
BEKLE:
     LCDOUT $FE,1,"DAKIKA:",#SAYAC1,"dk"
     LCDOUT $FE,$C0,"SANIYE:",#SAYAC2,"sn"
     PAUSE 70
     IF START=1 THEN
     WHILE START=1
     WEND
     GOTO CALIS
     ENDIF
     GOTO BEKLE
CALIS:
     PORTB.3=1
     ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.   
     LCDOUT $FE,1,"DAKIKA:",#SAYAC1,"dk"
     LCDOUT $FE,$C0,"SANIYE:",#SAYAC2,"sn"
     IF SAYAC1>0 AND SAYAC2=0 THEN SAYAC1=SAYAC1-1:SAYAC2=60
     IF SAYAC1>0 AND SAYAC2<1 then SAYAC2=60
     IF SAYAC1=0 AND SAYAC2=0 THEN SIFIRLA
     PAUSE 70
     GOTO CALIS
SIFIRLA:
     PORTB.3=0
     PAUSE 100
     SAYAC1=0
     SAYAC2=0
     LCDOUT $FE,1,  "     ZAMAN       "
     LCDOUT $FE,$C0,"     DOLDU       "
     PAUSE 1300
     LCDOUT $FE,1,  "     ZAMANI      "     
     LCDOUT $FE,$C0,"    AYARLAYIN    "
     PAUSE 1000               
     GOTO BASLA

DISABLE
KESME:
     DEGER=DEGER+1
     IF DEGER=17 then
      DEGER=0
      SAYAC2=SAYAC2-1
     ENDIF
     INTCON.2=0 'TMR0 Kesme bayragı sıfırlanıyor
RESUME
ENABLE
     END       
<<<***bahdiyarusta****>>>
                  - 66 -

Burak

#1
Timer0 bildiğiniz üzere clock pulse'lerini RA4 bacağından sağlamadığınız sürece saymasını durdurup tekrar başlatabileceğimiz bir modül değil .. Bu yüzden kafasına göre sizin kontrol edemediğiniz periyodlarda sürekli olarak kesmeye gitmekten kendini alamayacak... Bunun yerine bir başlat/durdur özelliği olan TIMER1 gibi bir sayaç modülü kullanmanız daha destekli olacaktır diye düşünüyorum ... Hem modülün 16 bitlik olması açısından kullanacağınız zaman hesaplarını daha rahat yapabilirsiniz ...

Burak
Ω Gens Una Sumus Ω

ete

KESME KULLANILAN PROGRAMDA DİREK PAUSE KOMUTU KULLANILMAZ.
KULLANIRSANIZ ZAMANLARINIZ ŞAŞAR. ZİRA KESME OLUŞTUĞU ANDA PAUSE KOMUTU İCRA EDİLİYOR İSE KOMUT SÜRESİ BİTMEDEN PROGRAM KESME ETİKETİNE ATLAYAMAZ: BUDA SAYACINIZIN ŞAŞMASINA SEBEP OLUR

Büyük harfle yazdım çünkü artık dilimde tüy bitti bunu söyleye söyleye. Ama ne yazıkki sürekli olarak karşıma çıkıyor ve yeniden açıklama yapmak zorunda kalıyorum. Lütfen öğrenin şunu artık.
Kesme kullanılan programlarda gecikme gerekiyor ise bunu döngüsel gecikmelerle ayarlayın.

Kesme kullanılmış bir programda PAUSE 100 gibi bir komut kullanırsanız ve bu komuta sıra geldiğinde kesme oluşmuş ise en azından program kesme etiketine 100ms sonra gidecektir.
FOR I=0 to 200
  PAUSEUS 5
Next
şeklinde bir komut dizisi kullanırsanız program en fazla 5us sonra kesme etiketine gidecektir buda ihmal edilebilir bir gecikme olur.
Döngüyü dahada büyüterek gecikmeyi artırabilirsiniz.

Kesme nin çalışabilmesi için ;
ON INTERRUPT GOTO KESME komut satırı başla etiketinden önce verilmelidir.
Kesme henüz aktif olmasın diyorsanız INTCON.7=0 olarak tutarsınız. Bu bit sıfır olduğu müddetçe herhangi bir kesme oluşmayacaktır. Kesmeleri aktif etme gereği duyduğunuz zaman ise INTCON.7=1 vermeniz yeterli olacaktır.

Zaman tutma ile ilgili kesme kullandığınız zaman sayacın bölme oranına ve ön yükleme değerine dikkat etmek gerekir.
Yada ne istediğinizi PicMultiCalc.exe isimli programa sorun o size hazır register değerlerini versin.
Örneğin Saat yapacağım ve her 10 ms de bir kesme oluşturacağım. Bu kesmeleri sayarak 100 kesme olunca 10x100=1000ms geçmiş olacaktır. Buda 1 sn olduğundan saniye değerini bir artıracağım.
Şimdi TMR0 kullanacaksam ne yapmalıyım. PicMultiCalc hemen bana;
- Bölme Oranı 1/64 olmalı
- Ön yükleme Değeri:99 olması gerekiyor şeklinde istediğim bilgileri veriyor.
Peki hesaplamak istersem nasıl yapacağım.
4 Mhz işlemci frekansında TMR0 her bir komut çevrimi 1us olan clk palsleri ise sayar.
O halde 0 dan başlayıp 256 yani tekrar sıfıra gelinde 256us  zaman geçirmiş olacaktır.
Bize lazım olan 10000us olduğu için bu rakamı 0-255 aralığına indirgeyecek bir bölme oranı bulmamız gerekir.
Ancak bölücülerimiz 1/1 , 1/2 , 1/4 , 1/8 , 1/16 , 1/32, 1/64 , 1/128 ve 1/256 şeklinde değerler olması gerekiyor.
10.000/32=312 olup 255 den büyük bir rakamdır. O halde bir kademe daha büyük bölücü kullanmak gerekecektir.
10.000/64=156 rakamını veriyor. O halde doğru bölücüdür. Bu bölücüyü kullandığım zaman, TMR0 sayacı her 64 puls da bir sayacaktır. Bu durumda gecikme miktarı 256x64=16384 us olacaktır. Bize 10.000 gerekiyor idi.
Bu durumda Sayac=10.000/64 şeklinde hesaplanacak demektir. Bu hesap sonucu 156 olarak çıkıyor. O halde bizim TMR0 sayacı her seferinde 156 defa saymalıdır. Sıfırdan başlatırsak sayac 156 ya gelince limit dolmuş olacaktır. Ama bu rakam kesme oluşturmaz. Kesme ancak sayacın 255 den 256 ya geçerken oluşturulabiliyor. Bu durumda ben sayacı yine 156 defa sayacak şekilde bir ön değer verir ve sayac değeri 256 ya gelince 156 defa saymış olmasını sağlarsam sorun çözülmüş olacaktır. Bunu sağlamak için 255-156=99 değerini sayaca verirsem 99 dan 256 ya kadar 156 defa saymış olacak ve kesme oluşturacaktır.
O halde TMR0 sayacını 99 dan başlatırım ve her kesme oluştuğunda yine sayaca 99 değerini yüklerim.
Bu tür hesaplamalarıda dikkate alırsanız sayaçlarınız doğru çalışacaktır.

Ete

bahdiyarusta

Hocam çok teşekkür ederim, akşam hemen üzerinde çalışacağım ,
<<<***bahdiyarusta****>>>
                  - 66 -

bahdiyarusta

merhabalar,

hocam yardımlarınız için teşekkür ediyorum,
dediğiniz gibi kodlarımı revize ettim ama zaman gari sayarken gerçek zaman gibi saymıyor,
hesaplamalar ortada ama bir yerde yanlış mı yazdım acaba anlayamadım kodları yazıyorum bakarsanız sevinirim,
@ DEVICE pic16F628A                      'i?lemci 16F628A                                
@ DEVICE pic16F628A, WDT_OFF              'Watch Dog timer açyk
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açyk
@ DEVICE pic16F628A, PROTECT_ON         'Kod Protek kapaly
@ DEVICE pic16F628A, MCLR_OFF            'MCLR pini kullanylMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanylacak

DEFINE OSC 4
TRISA=%11111111   
TRISB=%00000000
CMCON=7
SAYAC VAR WORD 'EKRANA RENKLERI YAZMAK ICIN KULLANILDI
SAYAC1 VAR WORD 'DK
SAYAC2 VAR WORD 'SN
DEGER VAR BYTE
I VAR WORD  'LCD TİTREŞİMİ İÇİN
'*****LCD TANIMLAMALARI*****
DEFINE LCD_DREG     PORTB       'LCD DATA BACAKLARI PORTB YE BAĞLI
DEFINE LCD_DBIT     4           'LCD DATA BACAKLARI PORTB.4 DEN BAŞLIYOR
DEFINE LCD_RSREG    PORTB       'LCD RS BACAĞI PORTB YE BAĞLI
DEFINE LCD_RSBIT    0           'LCD RS BACAĞI PORTB.1 BAĞLI
DEFINE LCD_RWREG    PORTB       'LCD RW BACAĞI PORTB YE BAĞLI
DEFINE LCD_RWBIT    1           'LCD RW BACAĞI PORTB.2 BAĞLI
DEFINE LCD_EREG     PORTB       'LCD ENABLE BACAĞI PORTB YE BAĞLI
DEFINE LCD_EBIT     2           'LCD ENABLE BACAĞI PORTB.3 BAĞLI
DEFINE LCD_LINES    4           'LCD 4 SATIRLI
DEFINE LCD_BITS     4           'LCD 4 BİT VERİ ALIŞ VERİŞİ YAPIYOR
PORTA=0
PORTB=0
SAYAC1=0
SAYAC2=0
DEGER=0
I=0
SYMBOL START=PORTA.0
SYMBOL ARTIR=PORTA.1
SYMBOL AZALT=PORTA.2


OPTION_REG=%10000101 'Pull  up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%0000000 'Kesmeler  pasif
ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.

TMR0=99

LCDOUT $FE,1,  "     ZAMANI      "     
LCDOUT $FE,$C0,"    AYARLAYIN    "
PAUSE 1500 
BASLA:
     LCDOUT $FE,1,"-> DAKIKA:",#SAYAC1,"dk"
     LCDOUT $FE,$C0,"SANIYE:",#SAYAC2,"sn"
     PAUSE 150                   
     IF SAYAC1<24 AND ARTIR=1 THEN SAYAC1=SAYAC1+1   
     IF SAYAC1>0 AND AZALT=1 THEN SAYAC1=SAYAC1-1
     IF START=1 THEN
     WHILE START=1:WEND
     GOTO SANIYE
     ENDIF
     GOTO BASLA
SANIYE:
     LCDOUT $FE,1,"DAKIKA:",#SAYAC1,"dk"
     LCDOUT $FE,$C0,"-> SANIYE:",#SAYAC2,"sn"
     PAUSE 150                   
     IF SAYAC2<60 AND ARTIR=1 THEN SAYAC2=SAYAC2+1   
     IF SAYAC2>0 AND AZALT=1 THEN SAYAC2=SAYAC2-1
     IF START=1 THEN
     WHILE START=1:WEND
     GOTO KAYDET
     ENDIF
     GOTO SANIYE
KAYDET:
     LCDOUT $FE,1,  "     ZAMAN       "
     LCDOUT $FE,$C0,"  KAYDEDILIYOR..."
     PAUSE 1000
BEKLE:
     LCDOUT $FE,1,"DAKIKA:",#SAYAC1,"dk"
     LCDOUT $FE,$C0,"SANIYE:",#SAYAC2,"sn"
     PAUSE 70
     IF START=1 THEN
     WHILE START=1
     WEND
     GOTO CALIS
     ENDIF
     GOTO BEKLE
CALIS:
     INTCON=%10100000 'Kesmeler  aktif
     PORTB.3=1   
     LCDOUT $FE,1,"DAKIKA:",#SAYAC1,"dk"
     LCDOUT $FE,$C0,"SANIYE:",#SAYAC2,"sn"
     IF SAYAC1>0 AND SAYAC2=0 THEN SAYAC1=SAYAC1-1:SAYAC2=60
     IF SAYAC1>0 AND SAYAC2<1 then SAYAC2=60
     IF SAYAC1=0 AND SAYAC2=0 THEN SIFIRLA
     FOR I=0 TO 5000
     PAUSEUS 1
     NEXT
     GOTO CALIS
SIFIRLA:
     PORTB.3=0
     PAUSE 100
     SAYAC1=0
     SAYAC2=0
     LCDOUT $FE,1,  "     ZAMAN       "
     LCDOUT $FE,$C0,"     DOLDU       "
     PAUSE 1300
     LCDOUT $FE,1,  "     ZAMANI      "     
     LCDOUT $FE,$C0,"    AYARLAYIN    "
     PAUSE 1000               
     GOTO BASLA

DISABLE
KESME:
     DEGER=DEGER+1
     IF DEGER=156 then
      DEGER=0
      IF SAYAC2>0 THEN SAYAC2=SAYAC2-1
     ENDIF
     INTCON.2=0 'TMR0 Kesme bayragı sıfırlanıyor
     TMR0=99
RESUME
ENABLE
     END
<<<***bahdiyarusta****>>>
                  - 66 -

~ENES~

O pause komutlari orda olduğu surece ete hocanin cevap vereceğini zannetmiyorum Bahadir abi :)
ALLAH'a teslim olmuş bir insan ! Ne sultan tanir , ne sadrazam !

bahdiyarusta

e tamam da abicm burada kesme gelmesini beklediğim döngüde pause komutu yok ki,
bu kesmeleri neden etkilesin ,
döngünün dışındaki pauseler nasıl etkileyecek,,,
onuda silerim ama silmek önemli değil mantıken doğruluğunu kavrayım tamam,
ben döngüyü kurunca kesme bekliyorum burda da pause yok,
<<<***bahdiyarusta****>>>
                  - 66 -

~ENES~

On interrupt komutu verilip kesme açildigi taktirde tmr0 sürekli calisir yani programdan bagimsizdir bu yüzden senin pause komutlarinda bunu etkiler..

Enes
ALLAH'a teslim olmuş bir insan ! Ne sultan tanir , ne sadrazam !

bahdiyarusta

ete hocanın
" Kesme nin çalışabilmesi için ;
ON INTERRUPT GOTO KESME komut satırı başla etiketinden önce verilmelidir.
Kesme henüz aktif olmasın diyorsanız INTCON.7=0 olarak tutarsınız. Bu bit sıfır olduğu müddetçe herhangi bir kesme oluşmayacaktır. Kesmeleri aktif etme gereği duyduğunuz zaman ise INTCON.7=1 vermeniz yeterli olacaktır."

yazısına göre baktığımda kesmeleri sadece kesme beklediğim döngüde aktif ettim, bu durumda diğer döndülerde kesme gelse bile kesmeler aktif olmadığı için pause komutlarına takılmayacaktır diye düşünmüştüm,
yani son yazdığım kodlara bakarsanız burada ne yapabiliriz ?
<<<***bahdiyarusta****>>>
                  - 66 -

ete

Bahdiyar,
Tam olarak ne yapmak istediğini söylermisin. Zira yaptığın işleri ezberden kopyala yapıştır yöntemi ile yaptığını düşünüyorum.
Nedenmi?
OPTION registerinden bölme oranını 1/64 olarak ayarlarsan ve TMR0=99 ön yükleme değerini verirsen senin bu Timer her 10 ms de bir kesme üretir. (gerçek değer biraz fazlası 10,055 ms de bir)
Sen bu kesmeleri kesme alt programında sayıyorsun ve 156 kesme oluşunca zaman sayacını bir artırıyorsun. 156 ne demek oluyor?
10,055 * 156 =1.568,580 ms  (1568ms + 580us) saniye sonra yani 1,5 saniyeden biraz fazla bir zaman diliminde sayacını bir artırıyorsun. Yoksa bu geçen zamanı 1 sn mi olacak sanıyorsun?.

Ete

bahdiyarusta

Hocam ilk yazdığım yazıda isis similasyon şemamı çizidim kartı da bastım hem similasyonda hem gerçekte deneme yapıyorum,
amacım zamanı ekrandan ayarlayacağım örn: 1dk  10sn starta basıncada röle çekecek 1dk 15sn röle çekecek zaman dolunca röle bırakacak ekranda da geri sayımı göreceğim olay bu, bunların hepsini similasyonda görüyorum çalışması doğru tek sıkıntım 1sn lik zaman ayarını yapamıyorum...

teşekkürler
<<<***bahdiyarusta****>>>
                  - 66 -

ete

#11
Aşağıdaki kodu dene bakalım istediğin bumudur.

Ete

@ DEVICE pic16F628A                      'i?lemci 16F628A                               
@ DEVICE pic16F628A, WDT_OFF              'Watch Dog timer açyk
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açyk
@ DEVICE pic16F628A, PROTECT_ON         'Kod Protek kapaly
@ DEVICE pic16F628A, MCLR_OFF            'MCLR pini kullanylMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanylacak
;@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF

DEFINE OSC 4
TRISA=%11111111   
TRISB=%00000000
CMCON=7
SAYAC VAR BYTE 56 'EKRANA RENKLERI YAZMAK ICIN KULLANILDI
SN    VAR BYTE 57 'DK
DAK   VAR BYTE 58 'SN
DEGER VAR BYTE
I VAR WORD  'LCD TİTREŞİMİ İÇİN
'*****LCD TANIMLAMALARI*****
DEFINE LCD_DREG     PORTB       'LCD DATA BACAKLARI PORTB YE BAĞLI
DEFINE LCD_DBIT     4           'LCD DATA BACAKLARI PORTB.4 DEN BAŞLIYOR
DEFINE LCD_RSREG    PORTB       'LCD RS BACAĞI PORTB YE BAĞLI
DEFINE LCD_RSBIT    0           'LCD RS BACAĞI PORTB.1 BAĞLI
DEFINE LCD_RWREG    PORTB       'LCD RW BACAĞI PORTB YE BAĞLI
DEFINE LCD_RWBIT    1           'LCD RW BACAĞI PORTB.2 BAĞLI
DEFINE LCD_EREG     PORTB       'LCD ENABLE BACAĞI PORTB YE BAĞLI
DEFINE LCD_EBIT     2           'LCD ENABLE BACAĞI PORTB.3 BAĞLI
DEFINE LCD_LINES    4           'LCD 4 SATIRLI
DEFINE LCD_BITS     4           'LCD 4 BİT VERİ ALIŞ VERİŞİ YAPIYOR
PORTA=0
PORTB=0
DAK=0
DAK=0
DEGER=0
I=0
SYMBOL START=PORTA.0
SYMBOL ARTIR=PORTA.1
SYMBOL AZALT=PORTA.2


OPTION_REG=%10000101 'Pull  up dirençleri İPTAL- Bölme oranı 1/64.
'Kesmeler  aktif
ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.

TMR0=99

LCDOUT $FE,1,  "     ZAMANI      "     
LCDOUT $FE,$C0,"    AYARLAYIN    "
PAUSE 1500
INTCON=%10000000 
LCDOUT $FE,1
BASLA:
     LCDOUT $FE,$80,"-> DAKIKA:",#DAK,"dk"
     LCDOUT $FE,$C0,"SANIYE:",#SN,"sn"
     PAUSE 150                   
     IF DAK<24 AND ARTIR=1 THEN DAK=DAK+1   
     IF DAK>0 AND AZALT=1 THEN DAK=DAK-1
     WHILE ARTIR=1 OR AZALT=1:WEND
     IF START=1 THEN
       WHILE START=1:WEND
       lcdout $fe,1
       GOTO SANIYE
     ENDIF
     GOTO BASLA
SANIYE:
     LCDOUT $FE,$80,"DAKIKA:",#DAK,"dk"
     LCDOUT $FE,$C0,"-> SANIYE:",#SN,"sn"
     PAUSE 150                   
     IF SN<60 AND ARTIR=1 THEN SN=SN+1   
     IF SN>0 AND AZALT=1 THEN SN=SN-1
     WHILE ARTIR=1 OR AZALT=1:WEND
     IF START=1 THEN
       WHILE START=1:WEND
       GOTO KAYDET
     ENDIF
     GOTO SANIYE
KAYDET:
     LCDOUT $FE,1,  "     ZAMAN       "
     LCDOUT $FE,$C0,"  KAYDEDILIYOR..."
     PAUSE 1000
     LCDOUT $FE,1
BEKLE:
     gosub ekran
     lcdout $fe,$94," BASLAMAK ICIN  "
     LCDOUT $FE,$D4," START'A  BASIN "
     PAUSE 70
     IF START=1 THEN CALIS_BIR
     
     GOTO BEKLE
CALIS_BIR:
           lcdout $fe,1
           INTCON.5=1
CALIS:                 
     PORTB.3=1   
     gosub ekran

     IF DAK=0 AND SN=0 THEN SIFIRLA
     FOR I=0 TO 500
     PAUSEUS 1
     NEXT
     GOTO CALIS
SIFIRLA:
     PORTB.3=0
     PAUSE 100
     DAK=0
     SN=0
     LCDOUT $FE,1,  "     ZAMAN       "
     LCDOUT $FE,$C0,"     DOLDU       "
     PAUSE 1300
     LCDOUT $FE,1,  "     ZAMANI      "     
     LCDOUT $FE,$C0,"    AYARLAYIN    "
     PAUSE 1000               
     GOTO BASLA

ekran:
     LCDOUT $FE,$80,"DAKIKA:",#DAK," dk "
     LCDOUT $FE,$C0,"SANIYE:",#SN," sn  "
     return

DISABLE
KESME:
     SAYAC=SAYAC+1
     IF SAYAC=99 then
       SAYAC=0
       SN=SN-1
       IF SN=255 THEN
         SN=59
         DAK=DAK-1
       ENDIF 
     ENDIF
     INTCON.2=0 'TMR0 Kesme bayragı sıfırlanıyor
     TMR0=99
RESUME
ENABLE
     END

bahdiyarusta

evet hocam sağlıklı çalışan bir program budur bir kaç noktada yanlışlık gördüm düzelttim,
genel olarak sapmak yok oldu hocam çok tesekkur ederim,,,
<<<***bahdiyarusta****>>>
                  - 66 -

bahdiyarusta

amacım sizlerden amacıma göre çalışan kodları yazın bana gönderin değil bunu belirmek isterim,
kendim yazabiliyorum ama bu konuda yeterli bilgim yok takıldıgım yerler oluyor hazırcı değilim bunu belirtmek istedim,
ilginizden dolayı teşekkür ederim,,
<<<***bahdiyarusta****>>>
                  - 66 -

Powered by EzPortal