bir butonla bir ledi yakıp söndürmek

Başlatan oktayc84, 11 Eylül 2004, 09:19:31

oktayc84

arkadaşlar selam öncelikle hepinize çalışmalarınızdan dolayı teşekkur ediyorum
benim bir sorum olacak 16f877 ve (pic basic pro) proton plus kullanıyorum 16f877 nin
a.1 portuna bir buton bağladım butona basınca portb.0 daki ledin yanması
bir kez daha basınca sönmesi istiyorum ne yapmalıyım
şimdiden teşekkürler
Her İyiliğin İçinde Bir Kötülük Her Kötülüğün İçinde Bir İyilik Vardır

ete

Basitçe işi aşağıdaki şekilde halledersin;

-önce bağlantı şekli;
PortA.0 da buton bağlı.PortA.0 aynı zamanda 10K ile +5V ta pullup yapılmış. Yani butona basılmadığı müddetçe PortA.0 High pozisyonda
Butona basılınca PortA.0 Low olacak çünki butonun diğer ucu GND ye bağlı.

PortB.0 da 330 Ohm seri olarak LED bağlı Led in diğer ucu GND de.

Şimdi tuşa basınca ne olur;
Tabiiki PortA.0=0 olur.

Bu durumda programımızı şöyle yazabiliriz.

IF PortA.0=0 then
Toggle Portb.0
Endif

Bu kadar.

Şayet Anolog girişlerden birisini kullanmayacaksanız programın başına
ADCON1=7 koymanız gerekir. (Analog pinleri Digital yapmak için)


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

oktayc84

şete selam şöyle demek istedim portb.0 da led bağlı ve sönük
butona birkere bastım led yanacak
birkere daha basıcam sönecek
Her İyiliğin İçinde Bir Kötülük Her Kötülüğün İçinde Bir İyilik Vardır

ete

Tamam işte;
basla:
        if PortA.1=0 then
           if z=1 then CIK
           Toggle PortB.0
           z=1
CIK:  Endif
       z=0
       goto basla
end
Bu komut dizisi tam senin istediğini yapar.
Toggle Portb.0 komutu yanık olan ledi söndürür. Sönük olan led i ise yakar.

Ancak, proton da Toggle komutu varmı yokmu bilmiyorum. Bu yüzden şayet yok ise kod aşağıdaki şekilde olacaktır;

if PortA.1=0 then
 PortB.0=Portb.0 XOR 1
endif

Not: XOR komutu bit bazında ^ işareti ile verilmektedir. Yani kodu şöyle yazmalısın;
PortB.0=PortB.0 ^1

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

oktayc84

ete selam kodu yazıyorum fakat butona sürekli bastığımda ledin yanıp sönmemesi için ne yapmalıyım


İYİ ÇALIŞMALAR
Her İyiliğin İçinde Bir Kötülük Her Kötülüğün İçinde Bir İyilik Vardır

peko

@oktayc84

merhaba ;

Dostum açıkçası ne yapmak istediğini ben anlayamadım  :?  ama;

:arrow:  1) Butona bir kez bastığında led yansın, (yanık kalsın)  tekrar bastığımda sönsün ( sönük kalsın) diyorsan..
---------------------------
basla:
if porta.1 = 0 then
pause 50 ( debounce time =  butona basış esnasındaki parazitli süre )
TOGGLE portb.0
endif
goto basla
end
---------------------------

:arrow:  2) " butona sürekli bastığımda ledin yanıp sönmemesi  "

---------------------------
basla:
if porta.1 = 0 then
pause 50
gosub yan
else
gosub son
endif
end

yan:
high portb.0
return

son:
low portb.0
return
---------------------------

kolay gelsin.

" Bazıları zeka'sını iş'i zorlaştırmak için, bazıları ise kolaylaştırmak için kullanır.. "

vatandas30

arkadaş sanırım tek butonla hem start hemde stop istiyor. ben daha önce şöyle bir program yazmıştım. proteusta denedim. her basışta çıkış değişiyor. eğer buton basılı tutulursa çıkış bir olmuşsa öyle kalıyor.

trisa=1
trisb=0
cikis var portb.0
giris var porta.0
portb=0
program:  
if giris=0 then karar
goto program
karar:
branch cikis,[yak, sondur]
yak:
cikis=1
if giris=0 then yak
goto program
sondur:
cikis=0
if giris=0 then sondur
goto program
end

oktayc84

slm arkadaslar ben olayı cozdum komutlar asağıdaki gibi


basla:
if porta.1=0 then toggle portb.0
beklet:
if porta.1=0 then goto beklet
pause 10
goto basla





YARDIMLARINIZ İÇİN TEŞEKKÜRLER
Her İyiliğin İçinde Bir Kötülük Her Kötülüğün İçinde Bir İyilik Vardır

ademoz05

#8
Alıntı yapılan: ete - 11 Eylül 2004, 09:39:10
Basitçe işi aşağıdaki şekilde halledersin;

-önce bağlantı şekli;
PortA.0 da buton bağlı.PortA.0 aynı zamanda 10K ile +5V ta pullup yapılmış. Yani butona basılmadığı müddetçe PortA.0 High pozisyonda
Butona basılınca PortA.0 Low olacak çünki butonun diğer ucu GND ye bağlı.

PortB.0 da 330 Ohm seri olarak LED bağlı Led in diğer ucu GND de.

Şimdi tuşa basınca ne olur;
Tabiiki PortA.0=0 olur.

Bu durumda programımızı şöyle yazabiliriz.

IF PortA.0=0 then
Toggle Portb.0
Endif

Bu kadar.

Şayet Anolog girişlerden birisini kullanmayacaksanız programın başına
ADCON1=7 koymanız gerekir. (Analog pinleri Digital yapmak için)


KOlay Gelsin

hocam yazdıklarınızı aynen yaptım oldu. hoca geçen hafta derste sormuştu, yarın gösterelim de 100ü kapalım :) teşekkürler.

konuyu da hortlattık  ???

tuggy

tebrikler adem:)

foruma üye olup, hemen bu başlığa çok benzer bir başlık açmayıp, önce forumda arayıp, bulup, deneyip, çalıştırabildiğin için.

ileride çok iyi bir elektronikçi olabilirsin;)

Mucit23

Alıntı yapılan: ete - 11 Eylül 2004, 10:41:37
Tamam işte;
basla:
         if PortA.1=0 then
            if z=1 then CIK
            Toggle PortB.0
            z=1
CIK:  Endif
        z=0
        goto basla
end
Bu komut dizisi tam senin istediğini yapar.
Toggle Portb.0 komutu yanık olan ledi söndürür. Sönük olan led i ise yakar.

Ancak, proton da Toggle komutu varmı yokmu bilmiyorum. Bu yüzden şayet yok ise kod aşağıdaki şekilde olacaktır;

if PortA.1=0 then
  PortB.0=Portb.0 XOR 1
endif

Not: XOR komutu bit bazında ^ işareti ile verilmektedir. Yani kodu şöyle yazmalısın;
PortB.0=PortB.0 ^1

ETE

Merhabalar ETE hocam hayırlı işler
Hocam verdiğiniz kodlarla ilgili aklıma bir konu takıldı

basla:
         if PortA.1=0 then
            if z=1 then CIK
            Toggle PortB.0
            z=1
CIK:  Endif
        z=0
        goto basla
end

Hocam yukarıda kodla ledin butona bastığımız sürece yanıp sönmesini yapmışsınız. Anlamadığım bir nokta var. Yanıp sönme hızını yavaşlatmak için z değişkeninin durumuna bakmışsınız. Kodları Türkçeleştirirsek "Eğer z sıfır ise ledin durumunu değiştir ve z yi 1 yap. Yok eğer  1 ise git z'yi  sıfır yap ondan sonra gel" Bi anlamda böyle oluyor. Fakat anlamadığım bi nokta var. Pic hızlı çalışıyor. Znin değeri 1 ise  ise gidip sıfır yapıp tekrar geri gelmesi uzun sürmez yani led yine çok hızlı yanıp sönmesi gerekmiyormu. Led displayli saat devrelerinizi inceledimde While;wend kullanmak yerine hep bunu kullanıyorsunuz. Bunun  Mantığı nasıl oluyor. Ben deniyorum.farkeden bişey olmuyor.
Bi tane 6 displayli multiplex çalışan saat-tarih ve derece yaptım. Programını yazıp bitirdim saat ayarlama bölümlerinde saati ayarlarken birer birer sayması için buna benzer ama çok daha farklı ve uzun bir yolla yapıyorum. Kesmeyle felan halletmem gerekiyor. Buton kontrolünde While wend kullanınca butona basılı kaldığı sürece pic tamamiyle duruyor. Hiç bir işlem yapmıyor taki bırakılana kadar.  Bunu biraz açıklarsanız sevinirim.

ete

Mucit,
Programlarda TUS kullanmanın amaca bağlı olarak çeşitli yolları vardır. Ben genellikle işaretçi diye adlandırdığım BIT değişkenleri kullanarak durumu kontrol ederim.
Senin isteğin bence farklı bir şey. Multiplex tarama sisteminde displalerin en fazla 3-5 ms de bir tazelenmesi gerekir.
Senin yapman gereken şey, tuşa basıldığı anda sayı değerini artırmak ve daha sonra araya biraz gecikme koymak. Gecikme bir döngü ile halledilir ise döngü arasına yerleştireceğin gosub komutları ile belirli aralıklarda ekran tazeleme işini yerine getirmen gerekir.
Bu şekilde havadan bu işi anlatmak çok kolay değil. Ortada referans alacağım kodlarda yok bu nedenle ancak  bu kadar anlatabilirim.

İşi Lafla anlatmak gerekir ise,
- Tuşa bastın
- Sayı değerini bir artırırsın ve ekrana verme kodlarını ayarlarsın
- Araya biraz gecikme koyarsın gerikirse burada bir döngü kurup gecikmeyi bu şekilde sağlarsın. Döngü arasına ekran tazelemeye git komutlarınıda koyarsan ekranın sekteye uğramayacaktır.
- Tekrar tuş kontrolüne atlatırsın

Biraz bilen birisinin anlatımına benzedi fazla detay olmadı ama havadan konuşmada ancak bu kadar olabiliyor kusura bakma.

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

Mucit23

Anladım hocam Dögü sonunda değilde döngü arasında ekrana gidip göstermek gerekiyor. Ben genelde koşulun sonunda gidiyorum hep. Ama herhaldeekrana gösterme işinide If koşulunun altına almam gerekecek. Neyse ben biraz uğraşayım.

Mucit23

#13
Hocam sonunda yaptım. Şimdi oldu işte.

Birde sizin bi konuda daha fikrinizi almak isterim.

Belki görmüşsünüzdür. Haftalık programlı çiçek sulayıcı devremi bitirdim. Aşağıdaki linkte
https://www.picproje.org/index.php/topic,30000.msg210070.html#msg210070
Devre çok güzel oldu sorunsuz bir şekilde çalışıyor.
Rölenin çalışması veya çalışmaması konusunda bazı olasılıklar var onları ele almak istiyorum.
Mesela 1. olasılık diyelimki röle çalışırken birisi geldi menüye girdi. Menüdeyken  Rölenin kapanmasını istiyordum. Ama menüden çıkıncada sulama saatleri geçmemişse eğer sulama işlemine devam etmesini istiyordum. Bunu yaptım burada sorunum yok.
Asıl şu sorun oluyor. Diyelimki röle çalışırken elektrikler kesildi ve bi 5 dk sonra yenden geldi. Şimdiki haliyle elektrik yeniden gelsede çalışmaz. Ama halbuki sulama saatleri geçmemiş. Ben sulama işlemine devam etmesini istiyorum. Picin bir şekilde elektrik kesilmeden önce rölenin çalıştığını hatırlaması lazım. Bunu rölenin açık veya kapalı  eprooma yazarak halledebilirim. Ama buradada sizin söyledikleriniz aklıma geliyor.Sakıncalı buluyorum.
Röle çalıştığı zaman rölenin açık olduğunu daima eproma üst üste yazacaktır. Veya röle kapalı olduğu zaman rölenin kapalı olduğunu eproma daima yazacaktır.
Bu iyi bişey değil Dediğiniz gibi eproomun belirli bir silinip yeniden yazılma ömrü vardır. Günlük çalışmayı göz önünde bulundurursak bu picin ömrünü çok kısaltacaktır. Bunun olmasını istemiyorum.
Öyle bişey olmalıki rölenin durumu değiştiğinde 1 kereliğe mahsuz rölenin durumun hafızaya yazıcak Dahada yazmıyacak. Taaki rölenin durumu tekrardan değişinceye kadar.
Bunu sizce nasıl yapabilirim yadayapılabilirmi. Bunu bir türlü çözemedim. Bu konuda sizin fikirlerinize ihtiyacım var.

Şimdilik yazdığım kodlar bunlar

'****************************************************************
'*  Name    : Çiçek sulama.BAS                                  *
'*  Author  : [Tasarım: FERHAT YOL]                             *
'*  Notice  : Bu program haftalık programlı çiçek sulayıcı için *
'*          : Ferhat yol (mucit23) tarafınca hazırlanmıştır.    *
'*  Date    : 25.06.2010                                        *
'*  Version : 1.2                                               *
'*  Notes   : Kullanılan işlemci Pic16F876 dır. 4MHz Kristal    *
'*          : kullanılacaktır.                                   *
'****************************************************************
DEFINE OSC 4
@ DEVICE pic16F876
@ DEVICE pic16F876, WDT_ON
@ DEVICE pic16F876, PWRT_ON
@ DEVICE pic16F876, PROTECT_OFF
@ DEVICE pic16F876, XT_OSC

TRISA=%00010111
TRISB=%00000000
TRISC=%00000111
PORTA=0
PORTB=0
PORTC=0
DEFINE LCD_DREG		PORTB	
DEFINE LCD_DBIT		4		
DEFINE LCD_RSREG	PORTB	
DEFINE LCD_RSBIT	2	
DEFINE LCD_EREG		PORTB	
DEFINE LCD_EBIT		3		
DEFINE LCD_BITS		4	
DEFINE LCD_LINES	2
ADCON1 = 7
ON INTERRUPT GoTo KESME  
OPTION_REG=%10000101   	 
INTCON=%10100000  		 
TMR0=0
    X       VAR     WORD
    E       VAR     BYTE
    AY      var     byte
    YIL     var     byte
    SN      VAR     BYTE
    DAK     VAR     BYTE
    SAAT    VAR     BYTE
    GUN     VAR     BYTE
    MEM     VAR     BYTE
    ONLAR   VAR     BYTE
    BIRLER  VAR     BYTE
    SAYAC   VAR     BYTE
    HAFTA   VAR     BYTE
    SAYI    VAR     BYTE
    SYC     VAR     BYTE
    AYR     VAR     BYTE
    ZYM     VAR     BYTE
    ZMN     VAR     BYTE
    SNY     VAR     BYTE
    SNS     VAR     BYTE
    KDS     VAR     BYTE
    AS      var     byte
    AD      var     byte
    KS      VAR     BYTE
    KD      VAR     BYTE
    KP      VAR     BIT
    RYM     VAR     BIT
    RAM     VAR     BIT
    GRS     VAR     BIT
    POZ     VAR     BIT
    PTESI   VAR     BIT
    SALI    VAR     BIT
    CARS    VAR     BIT
    PERS    VAR     BIT
    CUMA    VAR     BIT
    CTESI   VAR     BIT
    PAZAR   VAR     BIT
    
    MENU        VAR     PORTA.0
    YUKARI      VAR     PORTA.1
    ASAGI       VAR     PORTA.2
    SET         VAR     PORTA.4
    RTC_RST     var     PORTC.0
    RTC_CLK     var     PORTC.1
    RTC_DTA     var     PORTC.2
    
    SYMBOL ROLE=PORTA.3
    SYMBOL BUZER=PORTA.5
    SYMBOL LED=PORTB.1
    
    PAUSE 300
    HIGH LED    
    LCDOUT $FE,$40,0,1,2,18,10,4,0,0     'LCD 0. KARAKTER HAFIZASI ONAY İŞARETİ
    LCDOUT $FE,$48,0,17,10,4,10,17,0,0   'LCD 1. KARAKTER HAFIZASI ÇARPI İŞARETİ
    LCDOUT $FE,$50,16,8,4,2,4,8,16,0     'LCD 2. KARAKTER HAFIZASI YÖN İŞARETİ
    LCDOUT $FE,$58,14,17,16,16,17,14,4,0 'LCD 3. KARAKTER HAFIZASI Ç HARFİ
    LCDOUT $FE,$60,4,0,14,4,4,4,14,0     'LCD 4. KARAKTER HAFIZASI İ HARFİ
    LCDOUT $FE,$68,10,0,14,17,17,17,14,0 'LCD 5. KARAKTER HAFIZASI Ö HARFİ
    LCDOUT $FE,$70,14,0,15,16,19,17,15,0 'LCD 6. KARAKTER HAFIZASI Ğ HARFİ 
    LCDOUT $FE,$78,10,0,17,17,17,17,14,0 'LCD 7. KARAKTER HAFIZASI Ü HARFİ
    LCDOUT $FE,1
GIRIS: 
    LCDOUT $FE,$81,"OTOMAT",4,"K ",3,4,3,"EK "
    LCDOUT $FE,$C4,"SULAYICI"
    PAUSE 1500
    LCDOUT $FE,1
    LCDOUT $FE,$84,"TASARIM"
    LCDOUT $FE,$C3,"Ferhat YOL"
    PAUSE 1500
    LCDOUT $FE,1
ZMN=0:SNY=0
GOSUB BIPBIP

BASLANGIC:
READ $0,RYM
READ $1,PTESI
READ $2,SALI
READ $3,CARS
READ $4,PERS
READ $5,CUMA
READ $6,CTESI 
READ $7,PAZAR
READ $8,AS:IF AS>23 THEN AS=0
READ $9,AD:IF AD>59 THEN AD=0
READ $10,KS:IF KS>23 THEN KS=0
READ $11,KD:IF KD>59 THEN KD=0
IF SAAT>23 THEN SAAT=0
IF DAK>59 THEN DAK=0
IF SN>59 THEN SN=0
IF GUN>31 THEN GUN=1
IF AY>12 THEN AY=1
IF YIL>50 THEN YIL=1
IF HAFTA>7 THEN HAFTA=1
GOSUB ZAMAN_OKU
POZ=0
IF AS<=SAAT AND AD<=DAK AND KP=1 THEN HIGH ROLE
BASLA:
    GOSUB EKRANAYAZ
    GOSUB ZAMAN_OKU
    GOSUB AYABAK
    IF RYM=1 THEN GOSUB ZAMANA_BAK
    IF ZMN>100 THEN
    ZMN=0:POZ=1:low role
    GOSUB BIP
    GOTO AYAR_MENUSU
    ENDIF
    IF MENU=1 OR YUKARI=1 OR ASAGI=1 OR SET=1 THEN
    SNS=0:SNY=0
    HIGH LED
    ENDIF
    IF SET=0 THEN ZMN=0
    IF ROLE=1 THEN KP=1
    IF SNY>15 THEN LOW LED
    IF KS=SAAT THEN
       IF KD=DAK THEN
       low ROLE:KP=0
       endIF
    ENDIF
GOTO BASLA
'---------------------------ALT PROGRAMLAR-------------------------------------
EKRANAYAZ:
LCDOUT $FE,$80,DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
LCDOUT $FE,$C0,DEC2 GUN,"/"
LCDOUT $FE,$C6,"/20",DEC2 YIL
IF RYM=1 THEN LCDOUT $FE,$CC,"P.ON"
IF RYM=0 THEN LCDOUT $FE,$CC,"P.OF"
select case hafta
case 1 
LCDOUT $FE,$8B,"PAZAR"
case 2
LCDOUT $FE,$8B,"PTES",4           
case 3
LCDOUT $FE,$8B," SALI"                  
case 4
LCDOUT $FE,$8B," CARS"                     
case 5
LCDOUT $FE,$8B," PERS"
case 6
LCDOUT $FE,$8B," CUMA"
case 7      
LCDOUT $FE,$8B,"CTES",4
end select                     
RETURN

AYABAK:
SELECT CASE AY
CASE 1
LCDOUT $FE,$C3,"OCA"
CASE 2
LCDOUT $FE,$C3,"SUB"
CASE 3
LCDOUT $FE,$C3,"MAR"
CASE 4
LCDOUT $FE,$C3,"NiS"
CASE 5
LCDOUT $FE,$C3,"MAY"
CASE 6
LCDOUT $FE,$C3,"HAZ"
CASE 7
LCDOUT $FE,$C3,"TEM"
CASE 8
LCDOUT $FE,$C3,"AGU"
CASE 9
LCDOUT $FE,$C3,"EYL"
CASE 10
LCDOUT $FE,$C3,"EKi"
CASE 11
LCDOUT $FE,$C3,"KAS"
CASE 12
LCDOUT $FE,$C3,"ARA"
END SELECT
RETURN
  
ZAMANA_BAK:
   IF HAFTA=1 AND PAZAR=1 AND AS=SAAT AND AD=DAK AND SN=0 THEN HIGH ROLE 
   IF HAFTA=2 AND PTESI=1 AND AS=SAAT AND AD=DAK AND SN=0 THEN HIGH ROLE
   IF HAFTA=3 AND SALI=1 AND AS=SAAT AND AD=DAK AND SN=0 THEN HIGH ROLE
   IF HAFTA=4 AND CARS=1 AND AS=SAAT AND AD=DAK AND SN=0 THEN HIGH ROLE
   IF HAFTA=5 AND PERS=1 AND AS=SAAT AND AD=DAK AND SN=0 THEN HIGH ROLE
   IF HAFTA=6 AND CUMA=1 AND AS=SAAT AND AD=DAK AND SN=0 THEN HIGH ROLE
   IF HAFTA=7 AND CTESI=1 AND AS=SAAT AND AD=DAK AND SN=0 THEN HIGH ROLE 
RETURN         

TEMIZLE:
LCDOUT $FE,1
RETURN
BIPBIP:
     HIGH buzer   
    PAUSE 50
      LOW buzer 
    PAUSE 100
     HIGH BUZER
    PAUSE 50
      LOW BUZER 
RETURN
BIP:
HIGH BUZER
FOR X=0 TO 1000
NEXT X
LOW BUZER
RETURN

KAYDET:
lcdout $FE,1,"AYARLAR"
LCDOUT $FE,$C0,"KAYDEDILDI..."
GOSUB BIPBIP
PAUSE 800
AYR=0
GOSUB TEMIZLE
SNS=0:SNY=0

GOTO BASLANGIC

AYARLANDI:
lcdout $FE,1,"AYARLANDI..."  
GOSUB BIP
PAUSE 1000
AYAR_MENUSU:
WHILE MENU=1:WEND
GOSUB TEMIZLE
HIGH LED
AYR=0
ANA_MENU:
IF YUKARI=1 THEN 
  AYR=AYR+1
  gosub BIP
  WHILE YUKARI=1:WEND
  IF AYR>3 THEN AYR=0
ENDIF
IF ASAGI=1 THEN 
  AYR=AYR-1
  GOSUB BIP
  WHILE ASAGI=1:WEND
  IF AYR=255 THEN AYR=3
ENDIF
GOSUB DURUM
GOTO ANA_MENU
DURUM:
SELECT CASE AYR
CASE 0
LCDOUT $FE,$81,"  ZAMAN AYARI  "
       IF MENU=1 THEN
       WHILE MENU=1:WEND
       GOSUB BIP
       GOTO SAATAYAR1
       ENDIF
CASE 1
LCDOUT $FE,$81,"SULAMA AYARLARI"
       IF MENU=1 THEN
       WHILE MENU=1:WEND
       GOSUB BIP
       GOTO MOTORAYAR
       ENDIF
CASE 2
LCDOUT $FE,$81," MANUEL SULAMA "
       IF MENU=1 THEN
       WHILE MENU=1:WEND
       GOSUB BIP
       GOTO MANUEL_KONT
       ENDIF
CASE 3
LCDOUT $FE,$81," MENUDEN ",3,"IKIS "
       IF MENU=1 THEN
       WHILE MENU=1:WEND
       LCDOUT $FE,1
       GOTO KAYDET
       ENDIF
END SELECT
RETURN
MANUEL_KONT
GOSUB TEMIZLE
MANUELKONT:
LCDOUT $FE,$80,"YUKARIYA BASINIZ"
IF YUKARI=1 THEN 
LCDOUT $FE,$C0,"POMPA ACIK  "
HIGH ROLE
ELSE
LCDOUT $FE,$C0,"POMPA KAPALI"
LOW ROLE 
ENDIF
IF MENU=1 THEN
GOSUB BIP
GOTO AYAR_MENUSU
ENDIF
GOTO MANUELKONT
 
MOTORAYAR:
GOSUB TEMIZLE
READ $0,RYM
MOTOAYAR:
     LCDOUT $FE,$82,"POMPA DURUMU"
      IF MENU=1 and RYM=1 THEN 
        WHILE MENU=1:WEND
        WRITE $0,RYM
        GOSUB BIP:syc=0
        GOTO M_ZAMANI
      ENDIF
      IF MENU=1 AND RYM=0 THEN
        WHILE MENU=1:WEND
        WRITE $0,RYM
        GOSUB BIP
      GOTO AYARLANDI
      ENDIF
      IF YUKARI=1 THEN RYM=1
      IF ASAGI=1 THEN RYM=0
      IF RYM=1 THEN lcdout $FE,$C4," ACIK "
      IF RYM=0 THEN LCDOUT $FE,$C4,"KAPALI"
GOTO MOTOAYAR  
M_ZAMANI:
     GOSUB TEMIZLE
     READ $1,PTESI
     READ $2,SALI
     READ $3,CARS
     READ $4,PERS
     READ $5,CUMA
     READ $6,CTESI
     READ $7,PAZAR
M_ZAMAN:
     LCDOUT $FE,$81,"SULAMA G",7,"NLER",4 
IF MENU=1 THEN
     GOSUB BIP 
     SYC=SYC+1
     WHILE MENU=1:WEND
ENDIF
IF SET=1 THEN
    GOSUB BIP 
    SYC=SYC-1
    IF SYC>7 THEN MOTORAYAR
WHILE SET=1:WEND
ENDIF
GOSUB GUNEBAK

IF SYC=7 THEN 
SYC=0:KDS=0
WRITE $1,PTESI
WRITE $2,SALI
WRITE $3,CARS
WRITE $4,PERS
WRITE $5,CUMA
WRITE $6,CTESI
WRITE $7,PAZAR
GOTO M_CALISMA
ENDIF
GOTO M_ZAMAN
    
GUNEBAK:
SELECT CASE SYC
CASE 0
     IF YUKARI=1 THEN TOGGLE PTESI
     WHILE YUKARI=1:WEND 
     IF PTESI=1 THEN  LCDOUT $FE,$C0,"PAZARTESi=",0," " 
     IF PTESI=0 THEN  LCDOUT $FE,$C0,"PAZARTESi=",1," "  
CASE 1
     IF YUKARI=1 THEN TOGGLE SALI
     WHILE YUKARI=1:WEND 
     IF SALI=1 THEN  LCDOUT $FE,$C0,"SALI=",0,"     "
     IF SALI=0 THEN  LCDOUT $FE,$C0,"SALI=",1,"     "
CASE 2
     IF YUKARI=1 THEN TOGGLE CARS
     WHILE YUKARI=1:WEND
     IF CARS=1 THEN  LCDOUT $FE,$C0,"CARSAMBA=",0," " 
     IF CARS=0 THEN  LCDOUT $FE,$C0,"CARSAMBA=",1," "     
CASE 3
     IF YUKARI=1 THEN TOGGLE PERS 
     WHILE YUKARI=1:WEND
     IF PERS=1 THEN  LCDOUT $FE,$C0,"PERSEMBE=",0," " 
     IF PERS=0 THEN  LCDOUT $FE,$C0,"PERSEMBE=",1," "  
CASE 4
     IF YUKARI=1 THEN TOGGLE CUMA
     WHILE YUKARI=1:WEND
     IF CUMA=1 THEN  LCDOUT $FE,$C0,"CUMA=",0,"     "
     IF CUMA=0 THEN  LCDOUT $FE,$C0,"CUMA=",1,"     "    
CASE 5
     IF YUKARI=1 THEN TOGGLE CTESI
     WHILE YUKARI=1:WEND
     IF CTESI=1 THEN  LCDOUT $FE,$C0,"CUMARTESI=",0," "
     IF CTESI=0 THEN  LCDOUT $FE,$C0,"CUMARTESI=",1," " 
CASE 6 
     IF YUKARI=1 THEN TOGGLE PAZAR
     WHILE YUKARI=1:WEND
     IF PAZAR=1 THEN  LCDOUT $FE,$C0,"PAZAR=",0,"     "
     IF PAZAR=0 THEN  LCDOUT $FE,$C0,"PAZAR=",1,"     "  
END SELECT
RETURN

M_CALISMA:
GOSUB TEMIZLE 
READ $8,AS
READ $9,AD
READ $10,KS
READ $11,KD
ACILIS:
lcdout $FE,$82,3,"ALISMA SAATi" 
IF MENU=1 THEN 
GOSUB BIP
KDS=KDS+1
WHILE MENU=1:WEND
ENDIF
IF SET=1 THEN 
GOSUB BIP
KDS=KDS-1
WHILE SET=1:WEND
ENDIF 
IF KDS>4 THEN 
SYC=6
GOTO M_ZAMANI
ENDIF
GOSUB BAK3
IF AS=255 THEN AS=23
IF AS=24 THEN AS=0
IF AD=255 THEN AD=59
IF AD=60 THEN AD=0
IF KDS>1 THEN
GOSUB TEMIZLE 
GOTO KAPANIS
ENDIF
GOTO ACILIS

KAPANIS:
LCDOUT $FE,$82,"KAPANIS SAATi"
IF MENU=1 THEN 
GOSUB BIP
KDS=KDS+1
WHILE MENU=1:WEND
ENDIF
IF SET=1 THEN 
gosub BIP
KDS=KDS-1
WHILE SET=1:WEND
ENDIF
IF KDS<2 THEN
KDS=1 
GOTO ACILIS
ENDIF 
GOSUB BAK4
IF KS=255 THEN KS=23
IF KS=24 THEN KS=0
IF KD=255 THEN KD=59
IF KD=60 THEN KD=0
IF KDS>3 THEN 
KDS=0
WRITE $8,AS
WRITE $9,AD
WRITE $10,KS
WRITE $11,KD
GOTO AYARLANDI
ENDIF
GOTO KAPANIS



SAATAYAR1:
GOSUB ZAMAN_OKU
GOSUB TEMIZLE
ZYM=0       
SAATAYAR:
lcdout $FE,$83,"SAAT AYARI"
LCDOUT $FE,$C5,DEC2 SAAT,":",dec2 DAK,":",dec2 SN
 IF MENU=1 THEN 
 ZYM=ZYM+1
 GOSUB BIP
 WHILE MENU=1:WEND
 ENDIF
 IF SET=1 THEN 
 ZYM=ZYM-1
 GOSUB BIP
 IF ZYM>0 THEN GOSUB BIP
 WHILE SET=1:WEND
 ENDIF
 IF ZYM>5 THEN ZYM=0
 GOSUB BAK1
 IF ZYM=2 THEN 
 GOSUB TEMIZLE
 GOTO TARIHAYAR
 ENDIF
GOTO SAATAYAR

TARIHAYAR:
GOSUB AYABAK2
lcdout $FE,$83,"TARIH AYARI"
LCDOUT $FE,$C4,DEC2 GUN,"/"  
LCDOUT $FE,$CA,"/20",DEC2 YIL
IF MENU=1 THEN 
ZYM=ZYM+1  
GOSUB BIP    
WHILE MENU=1:WEND 
ENDIF
IF GUN>31 THEN GUN=1
IF GUN<1 THEN GUN=31
IF AY>12 THEN AY=1
IF AY<1 THEN AY=12
IF YIL>50 THEN YIL=0

IF SET=1 THEN 
ZYM=ZYM-1
GOSUB BIP
WHILE SET=1:WEND
ENDIF
IF ZYM<2 THEN 
LCDOUT $FE,1
ZYM=1:GOTO SAATAYAR
ENDIF         
GOSUB BAK2
IF ZYM=5 THEN GOTO GUN_AYARI
GOTO TARIHAYAR

GUN_AYARI:
GOSUB TEMIZLE
GUNAYARI:
LCDOUT $FE,$84,"G",7,"N AYARI"
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
HAFTA=HAFTA+1
IF HAFTA>7 THEN HAFTA=1
ENDIF
IF SET=1 THEN 
GOSUB BIP
WHILE SET=1:WEND
ZYM=4:GOTO TARIHAYAR
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
HAFTA=HAFTA-1
IF HAFTA=0 THEN HAFTA=7
ENDIF
IF HAFTA>7 THEN HAFTA=0

select case hafta
CASE 1
LCDOUT $FE,$C1,"PAZAR    "
case 2
LCDOUT $FE,$C1,"PAZARTES",4
case 3
LCDOUT $FE,$C1,"SALI     "
case 4
LCDOUT $FE,$C1,"CARSAMBA "
CASE 5
LCDOUT $FE,$C1,"PERSEMBE "
CASE 6
LCDOUT $FE,$C1,"CUMA     "
CASE 7
LCDOUT $FE,$C1,"CUMARTESI"
END SELECT

IF MENU=1 THEN
WHILE MENU=1:WEND
gosub ZAMAN_YAZ
goto AYARLANDI   
ENDIF

GOTO GUNAYARI

BAK1:
SELECT CASE ZYM
CASE 0
LCDOUT $FE,$C0,"SAAT"
IF YUKARI=1 THEN SAAT=SAAT+1
WHILE YUKARI=1:WEND
IF ASAGI=1 THEN SAAT=SAAT-1
WHILE ASAGI=1:WEND
IF SAAT>23 THEN SAAT=0
CASE 1
LCDOUT $FE,$C0,"DAK "
IF YUKARI=1 THEN DAK=DAK+1
WHILE YUKARI=1:WEND         
IF ASAGI=1 THEN DAK=DAK-1
WHILE ASAGI=1:WEND 
IF DAK>59 THEN DAK=0 
END SELECT
RETURN 

BAK2:
SELECT CASE ZYM
CASE 2
LCDOUT $FE,$C0,"GUN "
IF YUKARI=1 THEN GUN=GUN+1   
WHILE YUKARI=1:WEND            
IF ASAGI=1 THEN GUN=GUN-1    
WHILE ASAGI=1:WEND
CASE 3
LCDOUT $FE,$C0,"AY  "
IF YUKARI=1 THEN AY=AY+1   
WHILE YUKARI=1:WEND            
IF ASAGI=1 THEN AY=AY-1    
WHILE ASAGI=1:WEND 
CASE 4
LCDOUT $FE,$C0,"YIL "
IF YUKARI=1 THEN YIL=YIL+1   
WHILE YUKARI=1:WEND            
IF ASAGI=1 THEN YIL=YIL-1    
WHILE ASAGI=1:WEND                     
END SELECT
RETURN 

BAK3:
SELECT CASE KDS
CASE 0
LCDOUT $FE,$C5,2,DEC2 AS,":",DEC2 AD
IF YUKARI=1 THEN 
AS=AS+1
WHILE YUKARI=1:WEND
ENDIF
IF ASAGI=1 THEN 
AS=AS-1
WHILE ASAGI=1:WEND
ENDIF
CASE 1
LCDOUT $FE,$C5,DEC2 AS,":",2,DEC2 AD
IF YUKARI=1 THEN 
AD=AD+1
WHILE YUKARI=1:WEND
ENDIF
IF ASAGI=1 THEN 
AD=AD-1
WHILE ASAGI=1:WEND
ENDIF
END SELECT
RETURN

BAK4:
SELECT CASE KDS
CASE 2
LCDOUT $FE,$C5,2,DEC2 KS,":",DEC2 KD
IF YUKARI=1 THEN 
KS=KS+1
WHILE YUKARI=1:WEND
ENDIF
IF ASAGI=1 THEN 
KS=KS-1
WHILE ASAGI=1:WEND
ENDIF
CASE 3
LCDOUT $FE,$C5,DEC2 KS,":",2,DEC2 KD
IF YUKARI=1 THEN 
KD=KD+1
WHILE YUKARI=1:WEND
ENDIF
IF ASAGI=1 THEN 
KD=KD-1
WHILE ASAGI=1:WEND
ENDIF
END SELECT
RETURN

AYABAK2:                
SELECT CASE AY         
CASE 1                 
LCDOUT $FE,$C7,"OCA"   
CASE 2                 
LCDOUT $FE,$C7,"SUB"   
CASE 3                 
LCDOUT $FE,$C7,"MAR"   
CASE 4                 
LCDOUT $FE,$C7,"NiS"   
CASE 5                 
LCDOUT $FE,$C7,"MAY"   
CASE 6                 
LCDOUT $FE,$C7,"HAZ"   
CASE 7                 
LCDOUT $FE,$C7,"TEM"   
CASE 8                 
LCDOUT $FE,$C7,"AGU"   
CASE 9                 
LCDOUT $FE,$C7,"EYL"   
CASE 10                
LCDOUT $FE,$C7,"EKi"   
CASE 11                
LCDOUT $FE,$C7,"KAS"   
CASE 12                
LCDOUT $FE,$C7,"ARA"   
END SELECT             
RETURN                

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ZAMAN_OKU:
    high RTC_RST:OUTPUT RTC_DTA
shiftout RTC_DTA, RTC_CLK, 0, [$BF]:INPUT RTC_DTA
SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, HAFTA, YIL, MEM]  'OKU
         MEM=SN:GOSUB CEVIR:SN=SAYI
         MEM=DAK:GOSUB CEVIR:DAK=SAYI
         MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
         MEM=GUN:GOSUB CEVIR:GUN=SAYI
         MEM=AY:GOSUB CEVIR:AY=SAYI
         MEM=YIL:GOSUB CEVIR:YIL=SAYI
         MEM=HAFTA:GOSUB CEVIR:HAFTA=SAYI
     low RTC_RST 
  return
ZAMAN_YAZ:
         MEM=sn:gosub TERSCEVIR:sn=SAYI
         MEM=DAK:gosub TERSCEVIR:DAK=SAYI
         MEM=SAAT:gosub TERSCEVIR:SAAT=SAYI
         MEM=GUN:gosub TERSCEVIR:GUN=SAYI
         MEM=AY:gosub TERSCEVIR:AY=SAYI
         MEM=YIL:gosub TERSCEVIR:YIL=SAYI
         MEM=HAFTA:GOSUB TERSCEVIR:HAFTA=SAYI
    high  RTC_RST
SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0]    'WRT Protek açıldı
     low RTC_RST:PAUSEUS 10 
    high RTC_RST          
SHIFTOUT RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, HAFTA, YIL, 128]  'YAZ
     low RTC_RST
 PAUSEUS 10
  return
CEVIR:
         ONLAR=MEM & %01110000
         ONLAR=ONLAR>>4
         BIRLER=MEM & %00001111
         SAYI=ONLAR*10+BIRLER
  return
TERSCEVIR:
         ONLAR=MEM DIG 1
         ONLAR=ONLAR<<4
         BIRLER=MEM DIG 0
         SAYI=ONLAR+BIRLER
  return
  
DISABLE
KESME:
IF POZ=1 THEN ATLA
IF SET=1 THEN
  ZMN=ZMN+1
  IF ZMN=200 THEN ZMN=0
ENDIF
SNS=SNS+1
IF SNS=55 THEN
SNS=0
SNY=SNY+1
IF SNY>16 THEN SNY=0
ENDIF
ATLA:
 
INTCON.2=0    
RESUME 
ENABLE
END


Yazdığım programda İşlemci hafızasında neredeyse 1 kelime yazacak yer kalmadı. Okadarki hafıza dolu ilkemci dolu dolu çalışıyor. :D
Programı nasıl dahada hafifletebilirim diye düşünüp duruyorum :)
Baktımda 16F876 ile 18F252 nin bacak yapısı aynı. Geniş hafızadan dolayı bari onunla devam edeyim dedim onuda bi türlü yapamadım. pic basicde 18F serisiyle çalışmak niye böyle zor anlamıyorum. Mpasm'de benim gibi ayrıntıyı çok seviyor olsa gerek:)

Belki diyebilirsiniz " Altı üstü sadece bir çiçek sulacayak, bigün sulamış veya sulamamış ne farkeder." Haklısınızda Ama şöyle bişey var. Devrenin kullanım amacını birazcık değiştirdim. Önceki haliyle max. 1Dk süre boyunca sulama yapılıyordu. Bu süre çiçekleri sulamak için fazlasıyla yeter. Ama Ben daha çok bahçe sulamalarında kullanmak istedim. Devre önceki haliyle sulama günleri seçildikten sonra kaç sn sulama yapılacağının girilmesi isteniyordu. Şimdi ise pompanın açılış ve kapanış saatleri  ss:dd olarak girlimesi isteniyor. Bu sistemde ise min. 1Dk sulama yapılabiliyor.
Doğu Anadolu bölgesinde gündelik hayatta elektrik eksilmesi çok olası. Bu yüzden bu olasılığı göz ardı etmek istemiyorum. Bu konuda Sizlerin ve diğer arkadaşların görüşlerini almak istiyorum. Sizce bunu nasıl yapmam uygun olur.

Ha birde şu devre üzerindeki buzzer beni illallah ettirdi. Çalışmıyor. Belki buzzer ile transistörünü 3- 4 defa değiştirdim. Yeni buzzer taktığım zaman 1 iki defa çalışyor ondan sonra sesi kesiliyor. Devre çalışırken buzzeri süren transistörün bacaklarını kısa devre ediyorum Yine ses çıkmıyor. Buzzeri söküp dışarıdan gelirim veriyorum bu sefer çalışıyor. Nedir bunun derdi anlam veremiyorum. İlla 12v ilemi sürmek gerekiyor. Birde osilatörsüz buzzer kullanıp sound komutuyla süreyim diyorum.


ete

Mucit,

Yapmayı istediğin işi önce eproma kayıt etmeden nasıl yapabiliriz onu düşünelim.
Ben genelde okunan saat:dakika:saniye değerini tek sayıya yada başka bir deyişle dakika seviyesine indirgerim.
Mesela 18:22:15 gibi bir zaman değerini;
18 x 60+22 = 1.102
Sulama başlama ve bitiş zamanlarınıda aynı yöntemle tek sayıya indirgersen karşılaşırma yapman son derece kolay olacaktır.
Diyelimki sulama başlangıcı 17:30:00 ve bitiş saatide 19:00:00 olsun. Saat 18:22:15 de elektrik kesildi ve geri geldiğini varsayalım.
Bunların tek sayı karşılıkları;
Önce okunan zaman : 18 x 60+22=1102
Başlangıç :17x60+30=1050 ve Bitiş : 1140
Program yeniden başlayacağı için Başla satırına gelmeden önce başlamış yada başlaması gereken bir sulama varmıdır ona bakması gerekir.
Bunun için okunan zaman bitiş zamanından küçükmü ona bakarım. 1102<1140 dır o halde şimdide başlangıç okunan zamandan küçükmü ona bakarım. Yani 1050<1102 bütün veriler elektriklerin gidip geldiği saatin bir sulama programının ara yerine denk geldiğini gösteriyor.
O halde sulamayı açıp bitiş zamanında da sonlandırmak en doğrusu olacaktır.

Diğer bir metod ise;eeprom kullanarak bu işi bir şekilde halletmek olacaktır. Tabiiki epromun hep aynı adresini kullanırsan yazboz tahtasına dönecektir. Bu nedenle haftanın gününe göre bir kayıt yöntemi geliştirirsen 7 farklı adres kullanmış olursun.
Bir sulama başladığında hangi gün ise gün eprom adresi olur. Oraya 10 değerini yazarsın. Bu sulama açıldı anlamına gelir. Sulama bitince aynı adrese 255 yazarsın buda sulamanın kapandığı anlamına gelir. Elektrik kesilip geldiğinde ilgili gün adresine bakılıp orada 100 var ise sulama açılır. Kapanmayı tabiiki bitiş zaman kontrolü yapacaktır otomatikman.

Aklıma başka bir yöntemde gelmedi maalesef.
Ete

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