B

2 tane buton ile iki ledi 10 dk yanmasini saglamak ???

Başlatan bltcy, 12 Nisan 2014, 10:11:13

bltcy

Merhaba arkadaslar . Benim ufak bir sorunum var . 16f628 de iki ledi buton yardimi ile 10 dk sure ile yakmak istiyorum .
Bunun icin sole bir program yazdim . Ozetle

If tus0=0 then
Toggle led0
Pause 9999
Pause999
10 dkka olana kadar pauseyi tekrarliyorum
Low led0
Endif

. Gibi

Ama ayni programi iki buton led icin yazdigimda butonun birine basiyorum led yaniyor

Diger ledi yakmak icin ilk yanan ledin sonmesini beklemek zorunda kaliyorum

Iki ledi birden kullanabilecegim bir program varmidir .
Yani buton bire bastim led 1 yandi 1 dk sonra diger butona bastim o led de yandi 10 dkkayi tamamlayan led sondu  .

Bunu yazabilecek arkadaslara simdiden tesekkurler
.

ete

Bu işte tek zaman sayacı iki veya daha fazla led için zaman saymalıdır.
Bu arada 10dak=10*60=600 sn eder oda 600*1000=600.000 ms eder. Bunu 10'a bölersek 60.000 ms edecektir.
Ben her döngüde programı 10ms bekletirsem toplamda 60000 döngü sonra 10 dak geçmiş olacaktır.

BASLA:
IF TUSA=0 then
   LEDA=1
   SAY_A=60000
ENDIF

IF TUSB=0 then
  LEDB=1
  SAY_B=60000
ENDIF

IF SAY_A>0 then
  SAY_A=SAY_A-1
  IF SAY_A=0 THEN LEDA=0
ENDIF

IF SAY_B>0 THEN
  SAY_B=SAY_B-1
IF SAY_B=0 THEN LEDB=0
ENDIF
PAUSE 10
GOTO BASLA

şeklinde bir kod dizilimi ile istediğin olur diye düşünüyorum. SAY_A ve SAY_B değişkenleri word cinsinden tanımlanmalıdır.
Elbette sistem 10 dak. dan biraz fazla sayacaktır. bunun sebebi komut gecikmeleridir. Bunu da Pause 10 yerine Pause 9 veya Pause 8 yazarak bir nebze aşabilirsiniz.

Ete

bltcy

Alıntı yapılan: ete - 12 Nisan 2014, 10:39:46
Bu işte tek zaman sayacı iki veya daha fazla led için zaman saymalıdır.
Bu arada 10dak=10*60=600 sn eder oda 600*1000=600.000 ms eder. Bunu 10'a bölersek 60.000 ms edecektir.
Ben her döngüde programı 10ms bekletirsem toplamda 60000 döngü sonra 10 dak geçmiş olacaktır.

BASLA:
IF TUSA=0 then
   LEDA=1
   SAY_A=60000
ENDIF

IF TUSB=0 then
  LEDB=1
  SAY_B=60000
ENDIF

IF SAY_A>0 then
  SAY_A=SAY_A-1
  IF SAY_A=0 THEN LEDA=0
ENDIF

IF SAY_B>0 THEN
  SAY_B=SAY_B-1
IF SAY_B=0 THEN LEDB=0
ENDIF
PAUSE 10
GOTO BASLA

şeklinde bir kod dizilimi ile istediğin olur diye düşünüyorum. SAY_A ve SAY_B değişkenleri word cinsinden tanımlanmalıdır.
Elbette sistem 10 dak. dan biraz fazla sayacaktır. bunun sebebi komut gecikmeleridir. Bunu da Pause 10 yerine Pause 9 veya Pause 8 yazarak bir nebze aşabilirsiniz.

Ete
hocam iki sayaci nasil tanimlayacagimida yazarmisiniz ...

ete


bltcy

Alıntı yapılan: ete - 12 Nisan 2014, 11:14:40
SAY_A VAR WORD
SAY_B VAR WORD

Ete

Sagolun hocam eve gidince bi deneyecegm .
Pic konusunda yazilarinizdan cok sey ogrendim  hakkinizi helal edin :)

İlyas KAYA

Bu konuda epey farklı konular açılıyor ve hepsine ayrı ayrı cevap vermek gerekiyor. Buna üzülüyorum aslında.

(INFOGATE ) PIC BASIC PRO kitabının 55 nci sayfasında saat örneği mevcud.
Donanım kesmesi kullanılarak yapılmış.
saniye/dakika/saat bilgisine ulaşabiliniyor.

Küçük bir hata payı ile çalışıyor ancak bu hata payını hesaplamak kolay.
Uzayan satılarda süre değişeceği için yine en mantıklı yol donanımı kullanmak.

TMR0'ı farklı şekillerde kurup farklı sonuçlarda elde edilebilir.


Kodlar şu şekilde;



,

SAYIM VAR BYTE

SANIYE var byte
DAKIKA VAR BYTE
SAAT VAR BYTE


OPTION_REG = $55        ' TMR0 zamanlayıcısı 16.384 ms olarak ayalandı.
INTCON=$A0                 ' TMR0 kesmesi etkin
On interrup goto zaman ' TMR0 KESMESI OLUŞTUĞUNDA ZAMAN ALT PROGRAMINA GİT


ANADONGU:

LCDOUT $fe,1, #saat,":",#dakika,":",#saniye
....
...
.
.

GOTO ANADONGU



DISABLE

ZAMAN:

SAYIM=SAYIM+1

IF KESME<61 THEN SON     '61*16,384 =999.424 MS BU DA YAKLAŞIK 1 SN DEMEK.

SAYIM=0
SANIYE=SANIYE+1

IF SANIYE>=60 THEN
SANIYE=0
DAKIKA=DAKIKA+1

IF DAKIKA>=60 THEN
DAKIKA=0
SAAT=SAAT+1
IF SAAT>=12 THEN SAAT=0

ENDIF
ENDIF




SON:


INTCON.2=0

RESUME


END




Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

bltcy

Alıntı yapılan: İlyas KAYA - 12 Nisan 2014, 12:36:23
Bu konuda epey farklı konular açılıyor ve hepsine ayrı ayrı cevap vermek gerekiyor. Buna üzülüyorum aslında.

(INFOGATE ) PIC BASIC PRO kitabının 55 nci sayfasında saat örneği mevcud.
Donanım kesmesi kullanılarak yapılmış.
saniye/dakika/saat bilgisine ulaşabiliniyor.

Küçük bir hata payı ile çalışıyor ancak bu hata payını hesaplamak kolay.
Uzayan satılarda süre değişeceği için yine en mantıklı yol donanımı kullanmak.

TMR0'ı farklı şekillerde kurup farklı sonuçlarda elde edilebilir.


Kodlar şu şekilde;



,

SAYIM VAR BYTE

SANIYE var byte
DAKIKA VAR BYTE
SAAT VAR BYTE


OPTION_REG = $55        ' TMR0 zamanlayıcısı 16.384 ms olarak ayalandı.
INTCON=$A0                 ' TMR0 kesmesi etkin
On interrup goto zaman ' TMR0 KESMESI OLUŞTUĞUNDA ZAMAN ALT PROGRAMINA GİT


ANADONGU:

LCDOUT $fe,1, #saat,":",#dakika,":",#saniye
....
...
.
.

GOTO ANADONGU



DISABLE

ZAMAN:

SAYIM=SAYIM+1

IF KESME<61 THEN SON     '61*16,384 =999.424 MS BU DA YAKLAŞIK 1 SN DEMEK.

SAYIM=0
SANIYE=SANIYE+1

IF SANIYE>=60 THEN
SANIYE=0
DAKIKA=DAKIKA+1

IF DAKIKA>=60 THEN
DAKIKA=0
SAAT=SAAT+1
IF SAAT>=12 THEN SAAT=0

ENDIF
ENDIF




SON:


INTCON.2=0

RESUME


END






Peki hocam burdaki gecen sureyi nasil kullanicam ben

İlyas KAYA

LCDOUT $fe,1, #saat,":",#dakika,":",#saniye

olarak bir örnek verdim.

Eğer dakika yada saati kontrol etmek isterseniz


IF DAKIKA=5 THEN LAMBA=1  ' derseniz 5 dk sonra lambayı yakar.
IF SAAT=1 then lamba=0      ' derseniz 1 saat sonra lambayı söndürür.






Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Powered by EzPortal