Picproje Elektronik Sitesi

DERLEYİCİLER => PICBasic => Konuyu başlatan: oktayc84 - 11 Eylül 2004, 09:19:31

Başlık: bir butonla bir ledi yakıp söndürmek
Gönderen: oktayc84 - 11 Eylül 2004, 09:19:31
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
Başlık: bir butonla bir ledi yakıp söndürmek
Gönderen: 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
Başlık: bir butonla bir ledi yakıp söndürmek
Gönderen: oktayc84 - 11 Eylül 2004, 09:51:18
ş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
Başlık: bir butonla bir ledi yakıp söndürmek
Gönderen: 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
Başlık: bir butonla bir ledi yakıp söndürmek
Gönderen: oktayc84 - 18 Eylül 2004, 13:42:44
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
Başlık: bir butonla bir ledi yakıp söndürmek
Gönderen: peko - 18 Eylül 2004, 16:03:16
@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.

(http://www.geocities.com/ekocom/swdebounce.jpg)
Başlık: bir butonla bir ledi yakıp söndürmek
Gönderen: vatandas30 - 09 Ekim 2004, 22:06:25
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
Başlık: bir butonla bir ledi yakıp söndürmek
Gönderen: oktayc84 - 12 Ekim 2004, 12:55:53
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
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ademoz05 - 29 Aralık 2010, 00:13:34
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  ???
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: tuggy - 29 Aralık 2010, 20:31:22
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;)
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 29 Aralık 2010, 21:22:48
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.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 29 Aralık 2010, 22:01:36
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
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 30 Aralık 2010, 07:19:16
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.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 30 Aralık 2010, 18:14:51
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.

Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 30 Aralık 2010, 20:51:10
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

Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 30 Aralık 2010, 23:49:46
Merhabalar ete hocam Dediğinizde haklısınız. Saati dakika formatına çevirmek işlemleri kolaylaştır.

Hocam dediğiniz gibi oluyor fakat bazı sorunlar ortaya çıkıyor. İlk başta başla komutundan önce röleyi çalıştırmak için aşağıdaki komutu kullanmıştm
IF AS<=SAAT AND AD<=DAK THEN HIGH ROLE
Ne demişim burada ;" eğer açılış saati saatten küçükse veya eşitse ve açılış dakikası dakikadan küçükse veya eşitse röleyi çalıştır."
Burada sorun yok kod işliyor.ama atladığımız bi nokta var. Örnekle açıklayayım. Diyelimki saat 13:00 da röle çalışacak 14:00 da kapanacak saat 13:00 olduğunda röle çalışıyor. menüye girdiğimizde kapanıyor çıktığımızda tekrar çalışıyor. Aynı şekilde elektrik kesilip geldiğinde sulama saati geçmemişse yine çalışıyor. Röle çalışma saatleri arasında sorunumuz yok. Asıl sorun sulama saati dolup röle kapandıktan sonra başlıyor. Şöyle açıklayayım. sulama saati dolup röle kapanınca menüye girip çıktığımızda veya elektrik kesilip geldiğinde tekrar röle çalışıyor. Halbuki çalışmaması lazım. Nasıl oluyor dersek Başla komutundan önceki koşul sayesinde oluyor. Sulama süresi dolsa bile saat ve dakika açılış saatinden büyük olduğu için röle yine devreye giriyor. Bu yüzden başka bir yol bulmak gerekiyor. Bunu şöyle bir nezlede olsa çözdüm ama tam çözüm olmadı malesef şöyle yaptım. Rölenin kapama saatlerinin kontrol esildiği yer eskiden böyleydi
IF KS=SAAT AND KD=DAK THEN LOW ROLE
böyle olunca koşullar kapanış saatiyle açılış saati eşitlenene kadar röle açık kalacaktır.
ama aşğıdaki gibi yapılırsa sorun birazcıkda olsa çözülüyor
IF KS<=SAAT AND KD<=DAK THEN LOW ROLE
Fakat bu seferde pic ilk önce röleyi enerjileyip onra enerjiyi kestiği için rölede bir açıp kapama yine söz oluyor. Gözle görülebiliyor. Tahiminimce rölenin açılıp kapanma süresi 10 ms den fazladır. Bu çok sakıncalı
Bu durum beni yine başka yollar aramaya itiyor. Belkide yine çözüm eprooma yazmaktan geçiyor. Daha başka nasıl yapabilirim bilmiyorum. Hocam sizinde kafanızı çok  karıştırdım. İnş durumu anlatabilmişimdir.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 30 Aralık 2010, 23:58:11

Alıntı YapDiğ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.
Hocam sizin ikinci metodu zaten yapabiliyorum. normlade her günü ayrı bir değişkene yükleyip hafızaya kaydetmek yerine sadece röle durumunu (1 veya 0) hafızaya kaydedip ona bakarak sulama işlemi yapıyorum.
Benim yapmaktan sakındığım şey picin hafızasını öldürmemek yani rölenin durumu değiştiğinde sadece 1 kereliğine eprooma yazmak. Sizin dediğiniz gibi yapsam fark eden bişey olmayacaktır. Çünkü sonuçta yine röle açık veya kapalı olduğu sürece eproma bişeyler yazacaktır. Bunu önlemeye çalışıyorum. İnş çözebilirim
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 31 Aralık 2010, 08:03:00
Bana kalırsa saat hesaplarında saniyeyi dikkate almadığından kaynaklanıyordur bunlar.
Bir dakika usun bir süre yani 60 saniye işlemci bu süre zarfında epeyce iş yapıyor.
Karşılaştırma komutlarının başına IF Saniye <5 de bakalım yani bu karşılaştırma lk 5sn çinde yapılsın.

Kapan komutundan sonra yeniden çalışması enteresan. Simulasyonda yakalanabiliyormu bu an?.
Yakalanıyor ise mutlaka gözden kaçan bir husus vardır. Programı görmek isterim şayet böyle ise.
Bana yollarsan bakarım.

Ama sanki daha öncede benzer bir sorunla karşılaşmış ve sorunu saniye hesabınıda saat hesabına dahil ederek aşmıştımdiye hatırlıyorum.
Çünki  saat 18:22 de kapanış 18:22 olsun ;
IF AS<=SAAT AND AD<=DAK THEN HIGH ROLE .........komutu çalışacak ve ROLE HIGH yapılacaktır.
Aynı şekilde;
IF KS<=SAAT AND KD<=DAK THEN LOW ROLE .... komutuda aynı zaman diliminde çalışacak ve role LOW yapılacaktır. O halde röle bir HIGH bir lOW olacaktır.
Bu nedenle ya işin içine saniyeyi sokacak ve komutları;
IF AS<SAAT AND AD<DAK and SN<5 THEN HIGH ROLE
şeklinde ve kapanış içinde;
IF KS>=SAAT AND KD>=DAK and SN<5 THEN LOW ROLE  (büyüktür işaretine dikkat sen bunun yerine küçüktür kullanmışsın)
şeklinde değiştirirsen istediğin olacak sanırım.
İşi birazda fiziksel olarak düşün  18:22 senin kapanma saatin. Bu saat 18:22:00 - 18:22:01  -.. 18:22:05 şeklinde yürüyor.
18:22:05 i tam ortaya alırsan bunun altı role HIGH olacak üzerinde röle LOW olacaktır. İşte bunu çok iyi ayırd edebilmelisin.
Bu nedenle büyüktür , küçüktür komutlarını çok dikkatli kullan.

Ete

Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 31 Aralık 2010, 09:35:31
Hocam akşam gidince bi deniyeyim.
Kapan komutundan sonra tekrar açılma şöyle gerçekleşiyor. Röle kapandıktan sonra menüye girilip çıkılırsa yada elektrk gidip gelirse röle tekrardan çalışıyor. Normalde röle kapandıktan sonra daha çalışmıyor. Başla komutundan önceki  "IF AS<=SAAT AND AD<=DAK THEN HIGH ROLE"  komutunu işleme alınca röle çalışıyor.
Ama hocam bana kalırsa sn yeyi işleme katmamız bişey değiştirmeyecektir. Şöyle açıklayayım. Başla komutundan önceki röle çalıştırma komutunda ne demiştik. Saat açılış saatinden büyük veya eşitse röleyi çalıştır. Mesela saat 14:00 da röle kapanacak. yani kapanış saatimiz 14:00 Saat 14:00 olduğu zaman röle kapanacak tamam normal çalışmada sorun yok. Diyelim saat 14:30 oldu elektrik kesilip yeniden geldi. işlemci bakıyor kapanış saati 14:00, sistem saati 14:30 sistem saati kapanış saatinden büyük ohalde şart doğrulandı deyip röleyi çalıştırıyor. İşe saniyeyi eklersek ne olacak.Yine aynı şekilde kapanış saatimiz 14:00 olsun.  kapanma saati geldi ve röle kapandı. Aynı şekilde saat 14:30 da elektrik gidip geldi. bu sefer birde saniyeye bakıcak ne demiştik. sn<5 yani saniye 5 ten küçükse ve diğer koşullar doğrulanıyorsa röleyi çalıştır. Elektrik gidip geldiğinde sn yenin kaç olduğunu bilmiyoruz sn 5 ten büyükse röle çalışmayacaktır. Çalışması gereken zamanlardada yine sn 5ten büyük olduğu zaman çalışmayacaktır. Bunların hepsi menüye girip çıktığımızdada gerçelidir.

Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 31 Aralık 2010, 09:51:07
Anlattıklarından olaya tam olarak konsantre olabilmiş değilim. Yeniden çalışma olayı menü ye girip çıkıştamı oluyor yolsa elektrik kesilme olduktan sonramı oluyor. ?
Ancak yinede sorunun zaman sınıurlarının çok iyi belirlenmemiş olmasından kaynaklandığı konusunda ısrarlıyım. Bu noktaya yoğunlaş sorunu en kolay kendin bulursun.
Ete

Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 31 Aralık 2010, 11:23:08
Hocambu yeniden çalışma olayı hem menüden çıkışta hemde yeniden çalışmada gerçekleşiyor. Dikkat ederseniz yeniden çalıştırma komutu başla komutundan önce menüden çıkışta program başlangıçtan itibaren devam ediyor ondan sonra başla ile döngü arasına giriyor.
Çok araştırdım başka yol bulamıyorum.Yine en sağlıklı yöntem eproma kaydetmek olacak.
Bunun için aklıma bir yol geldi.
KP adında bir değişkenimiz olsun. Bu değişkene rölenin açık veya kapalı olduğunu kaydedelim. yani röle 1 ise KP=1 0 ise kp=0 gibi. Rölenin durumu değiştiğinde yani 1 den 0 olunca veya 0 dan 1 olunca eprooma kaydedecek. Tekrar röle durumu değişinceye kadar tekrardan röle durumunu eprooma yazmayacak. Yapmak istediğim şey budur. Şimdilik işteyim. Akşam eve gelince bunu üzerine çalışacam. Dediğim gibi asıl yapmak istediğim şey eprooma rölenin durumunu çalışma esnasında üst üste yazmamak.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 31 Aralık 2010, 11:42:57
Üst üste yazmamak için çare şöyle olabilir,
Epromdaki değer 100 ise >Röle aktif, 255 ise röle kapalı anlamına kullanırsan;
Rölenin aktif olduğu anda eprom değeri 100 yapılır ve sonunda program olarak yazma komutu verirse ve röle-eprom değeri 100 ise yazmaz. 255 ise yazar. Aynı şekilde röle kapalı iken bir kere 255 yazar ama tekrar yaz emri geldi ise ve değer 255 ise yeniden yazmaz.

Ben yinede programın karar kısmını görmek isterim. Neden yaptığını merak ediyorum ve bulmakda çok zor değil. Simulasyon dosyası ile bana yollayabilirsen bakarım.

Ete
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 31 Aralık 2010, 14:07:43
Tamam hocam akşama tüm dosyalarımı yollayayım şimdi işteyim.

Birde hocam epproma yazma il ilgili şöyle bir kod yazdım

    IF ROLE<>KP THEN
    ROLE=KP
    WRITE $12,KP:PAUSE 1
    ENDIF

Hocam başla döngüsü içerisine bu şekilde bir kod yazarsak çözmüş olamazmıyız.
Başla komutundan önce röle ile kp yi eşitliyoruz.
bundan sonra role ile kp eşitliği bozulana kadar eprooma bişey yazılmaz ne zamanki eşitlik bozulursa ozaman röleyi kp ye eşitler ve eprooma değeri yazar. Olurmu acaba
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 31 Aralık 2010, 17:38:32
Hocam buyrun dosyaları ekliyorum.
http://hotfile.com/dl/93271995/49dbb87/oto_sulama.rar.html
Program bu haliyle menüden sorunsuz bir şekilde çalışıyor. Sadece elektrik gidip gelmesinde rölenin kontrolünün yapılması gerekiyor.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 31 Aralık 2010, 20:20:45
Birşeyler yaptım. Hemen belirteyim.
Açılışta GOSUB ZAMAN_OKU komutunu iki defa vermez isen zamanı ilk seferde okuyamıyor.
Sorun büyük ölçüde buradan kaynaklanıyordu. Ancak yinede elektrik kesilmesinde röle kapanması gerekiyorsa bunu sağlama almakta yarar gördüm ve basit bir alt program yazdım. Oraya bakarsın. Adı Elektrik_Kontrol .
Programda bazı lüzümsuz fazlalıkları kısalttım. Kısaltma büyük ölçüde GUNEBAK isimli etikette yapıldı. Görünce anlayacaksın.
Bu sayede diğer ilaveleri yapabildim . Aksi halde program dolu idi.

Geriye yalnızca gece yarısı sulama sorunlarının tesbiti kalmış oluyor. Ancak kimsenin gece yarısı sulama başlatım gece yarısından sonrasında sonlandıracağını sanmıyorum. Buda mümkün diyorsan işin epeyce zor olacak. Haftanın gününü hesaba katman gerekecek bunu unutma.

Son olarak yazmış olduğum alt pograma menüden çıkışta bir gidip gelirsen menü çalışması esnasında başlamış olan sulamalara ati röleyide harekete geçirebilrisin. O kısım çalışıyor dedğin için hiç bakmadım. Ama sorun var ise çözümü söylemiş oldum.

Programda kesme kullanmışsın  ama büyük değerli pause lar görüyorum. Bunlar sakıncalı. Bunların yerine döngü tipi kısa fasılalı gecikmeler kullanman gerekir.
Son olarak programı aşağıdaki linkden yükleyebilirisin.

http://hotfile.com/dl/93289663/f22bef0/sulama_Ete.rar.html

Ete
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 31 Aralık 2010, 21:09:00
Hocam çok teşekkürler. Yaptığınız değişikler çok iyi olmuş. Çok güzel çalışıyor. Özellikle Günebak kısmında yapılan düzenlemeler programı çok hafifletmiş. Zaten en çok bu lcd ye veri gönderme komutları hafızayı kaplıyor.

Siz bunları yaparken bende boş durmadım bişeyler yaptım. Başarılıda oldum. hafızaya alma işini hallettim artık üst üste yazmıyor. Çokda güzel oldu. İşte programın başından başla döngüsünün sonuna kadar vereyim. Nasıl yaptığımı açıklayayım
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
ZMN=0:SNY=0:KP=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
read $12,KP:IF KP>1 THEN KP=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
ROLE=KP
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 SNY>15 THEN LOW LED
   
     IF ROLE<>KP THEN
        IF ROLE=1 THEN KP=1
        IF ROLE=0 THEN KP=0
     WRITE $12,KP:PAUSE 1
     ENDIF
       
    IF KS=SAAT and KD=DAK THEN low ROLE
GOTO BASLA


hocam anahtar kod burası
     IF ROLE<>KP THEN
        IF ROLE=1 THEN KP=1
        IF ROLE=0 THEN KP=0
     WRITE $12,KP:PAUSE 1
     ENDIF
       

Hocam burada sadece eprooma 1 kereliğine yazma yapıyor. Röle değeri birden den sıfıra yada sıfırdan bir konumuna yükseldiği zaman  komutlar işleniyor ve kp değeri hafızaya yazlıyor. Bunun için birde başla komutundan önce röle ile kpyi eşitlemek gerekiyor. Artık röle çalışırken devrenin enerjisini kesip verdiğimde çalışmaya devam ediyor. Emin olmak için Birde buraya sayaç ekleyip baktım. Hakkattende öyle röle açıldığı zaman sayac 1 artıyor. Aynı şekilde kapandığı zaman yine 1 artıyor. Sizin yaptığınız düzenlemeleride programa ekleyince çok dah iyi olacak program.

Gece yarısı sulama işini düşünmüştüm. Ama gözümü korkutuyor. Bu yüzden hiç bulaşmak istemiyorum. En önemli olasılıkları çözdüm. okadarınıda gerek yok diye düşünüyorum. Yinede bir bakayım belki kolay bir yolu vardır.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 31 Aralık 2010, 21:46:25
hocam şu dikkatimi çekti bişey sormak istiyorum.Sizin düzenlediğiniz programda elektrik_kontrol alt programı altında "READ HAFTA,TEMP" diye bir kod var.
İlk defa böyle bir makroya rastlıyorum. Bu kodun tam olarak görevi nedir. Read komutu sadece eprromdan bilgi okumak için kullanılmıyormuydu. Yada başka bir görevimi var
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 31 Aralık 2010, 23:40:09
Hafta bir degisken ve haftanın gun numarasını tutuyor.
1.gun 1 nolu adrese kayıt edilmis. Bu komut ile icinde
bulundugun günde sulama aktif (1) mi yoksa değilmi (0)
diye bakıyorum. Bir suru if kullanacagıma o gune ait
kaydı okuyorum yalnızca. Okunan degeride Temp isimli
degiskene atıyorum.  Hepsi bu.
Ete
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 01 Ocak 2011, 11:45:46
Bu sabah programına şöyle bir bakayım dedim. Sulama başlattım ama bir türlü başlamadı.
Sonra araştırınca önemli bir hata gördüm. Hatayı detaylı anlatacağım.
DS1302 de haftanın günü aşağıdaki formatta tutulur.
1. Gün Pazar dır., 2. gün Pazartesi, 3.gün Salı , 4. Gün Çarşamba ,5.Gün Perşembe, 6 gün Cuma ve 7. Gün ise Cumartesidir.
Sen programında bazı yerlerde bu formatı esas almışsın ama bazı yerlerde ise haftanın 1. gününü Pazartesi kabul etmişsin.
Hal böyle olunca ister istemez karışıklıklar ortaya çıkıyor. Hemen gerekli düzeltmeleri yaptım va sonuçta şimdi düzgün çalışıyor.

ZAMANA_BAK isimli etiket altında sulama zamanının gelip gelmediği bir sürü if satırı ile kontrol ediliyor idi.
Hemen altına yazmış olduğum ve aslında elektrik kesilmesinde röle açık mı değilmi kontrol etsin diye yazdığımız kısm aynı amacı taşıyor ve daha az kod ile çalışıyor. Bu nedenle senin satırları iptal edip bütün işi benim yazdığım koda yükledim. Böylece program biraz daha kısalmış oldu.

Programda haftanın günlerinde sulama açıkmı değilmi şeklinde epromun 1 nolu adresi ile 7 nolu adresi arasında bir kayıt tutuluyor.
Sonuçta bu kayıtlara ait değişkenler bit bazında ve sen epromda bunları 8 bitlik değişkenmiş gibi saklayıp okuyorsun. Bu kısım hata yapmıyor ama sakıncalı. Yani Bit değişkeni bit bazında saklanmalı değilse değişken tipi byte olmalıdır.
Şimdi bit değişkenlerini nasıl bit bazında saklayacağım diyeceksin. Haftada 7 gün var. bu 7 bitlik bir sayı gibi düşünülebilir.
SULA  isimli değişkenin 1.biti Pazar, 2. biti Pazartesi , 3.biti Salı ... 7.biti ise Cumartesi bilgisini 1 yada sıfır olarak tutabilir.
Şimdi bu işin organizasyonu nasıl yapılır birazda ona değinelim.
Başlangıçta SULA isimli değişken sıfır değerine sahip olacaktır.
Pazar günü sulamayı açarsam SULA=%00000010  değerini alacaktır. Bunu yapmak için SULA.Bit0[Hafta]=1 demen yeterli.
Pazartesi Sulamayı açarsam  SULA=%00000100 değerini alacaktır (yalnızca pazartesini açtığımızı farz ediyorum). Bunu yapmanın yoluda ,
SULA.Bit0[Hafta]=1 şeklinde olacaktır. Dikkat edersen komut şeklinde bir farklılık olmadı. Kilit faktör hafta isimli değişkenin haftanın gün sayısını taşıması olacaktır.
Aynı işi SULA=SULA DCD HAFTA  komutuda yerine getirebilir.
Şimdi Bu şekilde sula isimli değişkende bu bilgileri sakladığımızı düşünelim. Epromun bir adresine SULA değişkenini yazdım ve açılışta SULA değerini aynı adresten okudum. Peki sulama açıkmı değilmi nasıl bakacağım. 
IF SULA.bit0[Hafta]=1 then Sulama açık demektir.
Ancak başka bir yolu da şöyle olabilir. Açılışta SULA isimli değişken değerini epromdan okuduktan sonra,
Sula.Bit0[1]=Pazar
Sula.Bit0[2]=PErtesi
Sula.Bit0[3]=Salı
Sula.Bit0[4]=Cars
Sula.Bit0[5]=Pers
Sula.Bit0[6]=Suma
Sula.Bit0[7]=Certesi
şeklinde eski değişkenlerine eşitleyebilirsin.

Programda bir kaç kısaltma daha yapılabilir. Bir birinin aynısı olan 2şerli 2 adet bölüm var. Bunlardan birisi Ekrana yaz etiketinde yer alan haftanın günlerine göre gün isimlerini ekrana yazan kısım ile Select Case Hafta kısmında aynı amaca yönelik kısım. Aralarındaki tek fark ekran adresi. Şayet adreslemeişini bir şekilde halledebilirsen bunları tek bir alt programa düşürebilirsin.  Aynı şekilde Ayların ekrana yazılmasıda benzer şekilde 2 alt programda yer almakta.
Adresleme şu şekilde halledilebilir.
Birinde  LCDOUT $FE,$8B,"PAZAR"  şeklinde yazan kısım diğerinde , LCDOUT $FE,$C1,"PAZAR    " . Hemen görüleceği gibi birinde $8B olan ekran adresi diğerinde $C1 şeklinde yer almaktadır.
O halde ekran adresini bir değişkene verirsem ve Ekrana yaz adresine gidince Adres=$8B  , diğerine gidince ADres=$C1 dersem sorun çözülmüş olur. Böylece her iki bölüm için tek alt program kullanımış olurum.
Benzer mantıkla Ayabak ve ayabak2 alt program altındaki kısımlarda teke düşürülebilir.

Bir diğer kısaltma da özel olarak tanımladığın check işareti ile X işaretinin adreslerini yer değiştirmek olurdu. Böylece 0 ile çalışan işaret 1 ile çalışır ve 1 ile çalışanda 0 ile çalışır duruma gelirdi. Buda sana ;
CDOUT $FE,$C0,"PAZARTESi=",(1-PTESI)," "   komutlarında  (1-PTESI) yerine direk PTESI yazma imkanı verir ve ordaki çıkarma işleminden kurtulmuş olurdun.

Hepsi Bu kadar.
Düzeltilmiş doyaları bir yere koymamı istersen koyabilirim.

Ete

Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 01 Ocak 2011, 17:11:21
Hocam çok teşekkürler. Ben hiç bu kadarını düşünmemiştim.Aslında ben picin eproomna veri yazarken mesela 1 btilik bir değer yazarken epromda sadece 1 bitlik yer kaplayacağını düşünmüştüm. Ama galiba kullanıcı için ayrılan eprom adresleri 1 er byte lık.
Hocam dediklerinizi dikkate alarak. ben kendim programı düzeltmeye çalışacağım. Siz bilirsiniz isterseniz verebilirsiniz. Programı incelemem hatarımı görmek için daha iyi olur. Ben program üzerinde biraz çalışayım
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 01 Ocak 2011, 18:25:53
hocam bu kodu tam olarak anlayamadım
IF SULA.bit0[Hafta]=1
şimdi burada anladığım kadarıyla 1 byte lık sula değişkeni içerisine haftanın günlerini yerşetiriyoruz. sula değişkeninin 0. biti pazar ,1. biti ptesi,2. bit salı .... Bu şekilde heprsini bir bytelık veride saklayabiliyoruz. O halde her günü epromun farklı adreslerine yazmamıza gerek yok değilmi.
yukarıdaki kodda anlamadığım nokta parantez içerisindeki hafta değişkenin ni görevi nedir.
sula değişkeninne veri yazmakda şöyle olabilirmi
SULA.bit0=1 yani sula değişkeninnin 1. biti 1 yapıldı. 1. bit hangi güne eş geliyorsa o gün sulamaya açıldı demektir. Normalde programda HAFTA isimli değişke ds 1302 den alınan haftanın gün bilgisini tutuyor. yukarıdaki kodla nasıl ilişkisi oluyor merak ediyorum. Hocam siz en iyisi yazdığını kodları bi verin inceleyeyim nasıl düzeltmer yapmışsınız.Böyle giderse size çok soru soracağım.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 01 Ocak 2011, 19:52:39
Bahsini ettiğim düzeltmelerin biri hariç hepsini yaptım. Yalnızca haftanın günlerini yazdıran kısmı değiştirmedim. Bazı günlerde kısaltma kullanmışsın ama diğerinde kısaltma yok idi o nedenle ona dokunmadım.
Dosya aşağıdaki linktedir.

Ete

http://hotfile.com/dl/93491853/737a924/CICEK_ETE.rar.html
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 01 Ocak 2011, 20:37:20
Hocam hotfileden indirme yapamıyorum. Başka dosya indirmememe rağmen 1 seferde sadece bir dosya indirebilirsiniz diyor. Sizden ricam başka bir siteye yükleyebilirmisiniz
-----------------------------------------------------------------------
Hocam gerek kalmadı aldım dosyaları. Teşekkürler ilginiz için
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 01 Ocak 2011, 22:19:30
Yeni link,

http://rapidshare.com/files/440295421/CICEK_ETE.rar

ete
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 03 Ocak 2011, 22:02:58
Merhabalar hocam kolay gelsin.
Hocam bugün internette bir yazı okudumda tarımla  uğraşanlar için sulama işleminin buharlaşmanın en az olduğu gece vakitlerinde sulama yapılmasını tavsiye ediyorlar. Üstelik Şimdi dijital sayac kullananlar için Gece elektrik dahada ucuz oluyor.(gece gündüz tarifleri farklı olduğu için).Bunların bilincinde olan bir çiftçi elbette ağaçlarını bahçesini gece sulama yapmak isteyecektir.

Bunları düşününce bu gece yarısı sulama işlemi aklıma takılıyor. Ben biraz uğraştım ama pek sonuç alamadım. Araya günü sokmadan yapsam oluyor. Fakat bu seferde devrenin enerjisini kesip versem unutuyor. Galina yine bir değiken tutup ona da rölenin acılış saatinin kapanış saatinden büyük olduğu bilgisini tutmak gerekiyor. İşin zor tarafı şu diyelim pazartesi  akşam saat 10 da sulamayı açtık. Salı sabah 8 de kapanacak peki salı günü sulamalar komple kapalı ise ne olacak. Şöyle olabilir zaten açılış saati pazartesi günü, eğer açılış saati salı günü olsaydı çalışmazdı. Öyle olabilir ancak yani haftanın gününü hiç devreye sokmayacağız. Yapmam gereken açılış saati kapanış saatinden büyükse bunu bir değişkenle kayıtta tutmak böylelikle enerji gidip geldiğinde sulamaya devam edebilirim.
Bu konuda siz neler düşünüyorsunuz nasıl yapmam uygun olur sizce
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 04 Ocak 2011, 07:42:01
Ferhat,
Şayet kesin olarak gece sulama işinide yapayım dersen program mantığını değiştirmen gerekebilir.
Ele alacağımız bir gün için sulama var yada yok demenin hiç bir avantajı yok bence. O güne ait sulama açılmış ise sulama var demektir. O güne ait sulama açılmamış ise sulama yk demektir. Neden böyle kendini kısıtladın anlamadım. Ayrıca unutma gerçek sulama sistemleri gün içinde birden fazla (bildiğim en az 2 en fazla 4 adet ) sulama program uygulamaktadır. Örnek sabah saat 11 de sulama başlıyor saat 14 de sulama kesiliyor. Akşam saat 16 de başlıyor 23 de kesiliyor gibi. Tek sulama programı bu iş için yeterli değil.
Benzer bir ticari proje yapmıştım. O projede hafta içinde gün seçiyor ve o güne ait 4 ayrı vana ve her vana için 4 ayrı sulama programı verebiliyordun. Benim mantığımda program her dakika için açılacak sulama varmı yada açık olup da kapatılacak sulama varmı ona bakıyor idi. Olayı bu şekilde düşünürsen daha kolay halledersin.

Sonuç olarak gece 23 de açılacak bir sulama ertesi gün sabah 8 de kapatılacak ise;
önce saat 23 de açılacak sulama varmı diye bakmak ve elektrik kesilip geri geldiğinde açılmış sulama varmı ona bakmak gerekir.
Ertesi sabah ise hem açılacak sulama varmı diye bakarken hemde kapatılacak sulama varmı diye bakmak lazım gelir. Ben böyle düşünüyorum.
Elektrik kesilmesi ve geri gelmesi durumu insanı uğraştırır. Doğru yolu bulmak zaman alabilir. Bu nedenle en iyisi yine eepromu kullanmak olmalı. Sulama açtığında bir şaret bitini set edip , mesela ACIK isimli bir değişken 7 güne ait açılan sulamaları tutsun. ACIK.1 Pazar, ACIK.2 Pazartesi gibi ilgili gün bitleri set edilmiş ise yani 1 ise o gün sulama açılmış ama henüz kapatılmamış anlamına gelsin. Sulama kapandığı zaman ilgili gün bitinide sıfır yaparsan sorunun çözülmüş olacaktır. Elektrik gidip geldiğinde ACIK değeri eepromdan alınıp içinde bulunduğun güne ait yada tamamı için açılmış sulama varmıdır bakmak gerek. Tabiiki bakarken de elektrik kesildiğinde sulamanın kapanma saatide geçilmiş olabilir. Önce 1. mantığa göre açarsın sonrada kapanma saatlerini kontrol edip kapanacakları kapatırsın diye düşünüyorum. Bir anda yapılacak bu işlemde aç kapa işlemi kullanıcı tarafından görülemez bile.
Benim düşüncelerim bu yönde.

Ete
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 04 Ocak 2011, 12:29:45
Hocam aslında çok mantıklı kapsamlı bir proje olacak ise günde bir defa sulama yetmeyebilir.dediğiniz gibi günde bir kaç defa sulama işlemi yaptırmak isteyebilir. Bence eğer böyle bişey yapıcaksam 16F876 oyalanma olur. Bu haliyle bile program sınırlarda geziyor. Daha geniş bir program kapasitesi olabilecek bir pice geçmeliyim. Bu iş için bence en uygun olanı 18F252 dir. Hem pin sayısı 16F876 ile uygun hemde program hafızası çok geniş. Ben bu programda şimdilik bu kadar değişiklik ve özellik yeter. Gece sulama işin bir şekilde hallederim.
Eğer iyi bir proje yapılacaksa 1 çıkışlı değil 1 den fazla röle çıkışlı  ve her röle için günlük olarak ayrı sulama programları seçilebilir. Önümdeki tek engel şu 18F252 ile derleme yapamamam. Hocam ne yaptıysam şu hatalardan kurtulamadım. Dediğiniz gibi PBP klasörünün içindeki 18f252.inc klasöründeki  config ayarlarını pasif yaptım. configürasyon ayarlarını MPASM klasöründeki yazılanları aynısını yazdım fakat yine hata veriyor . Nerede hata yapıyorum anlamıyorum. Bu yüzden bir türlü 18Fserisine ısınamadım. Bunun bir püf noktasımı var yapanlar nasıl yapıyor arkadaş....
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 04 Ocak 2011, 12:34:43
Yada yeni bir proje yapmamada gerek yok belki ileride.
Eğer 18F252 yi kullanırsam Bu program çok ek özellikler getirecem aklımda kullanıcıya özel bir sürü şey var. Tek engelim işlemci hafızası..  :(
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 04 Ocak 2011, 12:47:48
18F serisi ile derleme yapmanın bir yolu var ve onuda sana izah ettim.
Mutlaka ya bir şeyi yanlış yapıyorsun yada PBP sürümün eskidir.
Yapılacak işlemleri yeniden sıralıyorum; Örneği 18F252 üzerinden yapıyorum senin için kolaylık olur.

1. PBP klasörü içinde  18F252.INC dosyasını MCS ye yükleyeceksin.
2. Config satırları aşağıdakiler olacaktır;
        __CONFIG    _CONFIG1H, _OSCS_OFF_1H & _XT_OSC_1H
        __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
        __CONFIG    _CONFIG4L, _LVP_OFF_4L
3. Bunların baş tarafına birer ; koyacaksın sonuçta satırlar şöyle olacak,
;        __CONFIG    _CONFIG1H, _OSCS_OFF_1H & _XT_OSC_1H
;        __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
;        __CONFIG    _CONFIG4L, _LVP_OFF_4L
4. Sonra bu dosyayı yerine geri kayıt edeceksin.
5. MPASM (Proteus / Tools klasöründe mevcut) içinden P18F252.INC dosyasını MCS ile açacaksın
Dosyanın sonuna doğru "Configurasyon Bits" şeklinde bir satır bulacaksın onun altında ayarlanması gereken Config bitleri ve daha altta da her bir config bitinin alması gereken değerleri göreceksin. Bir tane örnek vereyim.
;Configuration Byte 1H Options  başlığı altından OSC tipleri verilmektedir. Diyelimki HS tipini kullanacaksın. Bunun programa yazılış şekli;
@ASM
__CONFIG    _CONFIG1H, _OSCS_OFF_1H & __HS_OSC_1H
...
...
endasm
bu listeye dahil edilecek olan ayarların listesi Config bitleri başlığında veriliyor zaten. Yukarıda benim .... ile geçtiğim yerlere bunları satır satır yazman gerek.

Hepsi bu kadar.
Tam emin değilim ama bu sistem PBP250 ve yukarısında çalışıyor sanırım.

Ete


Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 04 Ocak 2011, 14:25:18
Hocam dediklerinizi uyguladım
PBP klasörünün içindeki 18F252.inc klasörünü mcs ye yükleyip değişiklikleri yaptıktan sonra tekrar ismini değiştirmeden aynı klasör içerisine inc olarak kaydettim.
Sonra mpasm klaösünün içindeki 18F252.inc klasörünü açıp configürasyon ayarlarını teker teker yazdım. Birde ufak bi led yak södür uygulaması yazdım. İşlemciyi 18F252 olarak seçip derle tuşuna bastığımda hiç derleme bile yapmadan kırmızı hatalar veriyor.
[IMG]http://img692.imageshack.us/img692/4764/adszjha.png[/img] (http://img692.imageshack.us/i/adszjha.png/)

Uploaded with ImageShack.us (http://imageshack.us)
Anlama veremedim.
Yazdığım kodlar bunlar
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 04.01.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE OSC 4

TRISA=%00000000
TRISB=%00000000
TRISC=%00000000
PORTA=0
PORTB=0
PORTC=0

asm
__CONFIG    _CONFIG1H, _OSCS_OFF_1H & _XT_OSC_1H
__CONFIG    _CONFIG2L, _BOR_ON_2L & _BORV_20_2L & _PWRT_OFF_2L
__CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
__CONFIG    _CONFIG3H, _CCP2MX_ON_3H
__CONFIG    _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
__CONFIG    _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
__CONFIG    _CONFIG5H, _CPB_ON_5H & _CPD_OFF_5H
__CONFIG    _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG    _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG    _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG    _CONFIG7H, _EBTRB_OFF_7H
ENDASM


BASLA:
HIGH PORTB.0
PAUSE 500
LOW PORTB.0
PAUSE 500
GOTO BASLA
END

Verilen hatalar ise bunlar
FATAL ERROR: Too many errors. (21)
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 13: Redefiniton of LABEL TRISA.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 13: Syntax error.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 14: Redefiniton of LABEL TRISB.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 14: Syntax error.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 15: Redefiniton of LABEL TRISC.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 15: Syntax error.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 16: Redefiniton of LABEL PORTA.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 16: Syntax error.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 17: Redefiniton of LABEL PORTB.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 17: Syntax error.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 18: Redefiniton of LABEL PORTC.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 18: Syntax error.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 35: Redefiniton of LABEL BASLA.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 36: Bad expression.
C:\USERS\WIN 7\DOCUMENTS\MCS\18F252.BAS ERROR Line 38: Bad expression.

Sorun ne olabilir.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 04 Ocak 2011, 14:32:39
Senin programı bende kopyalayıp derledim sıfır hata ile derledi.

Bu durumda senin basic klasöründe bir sorun var.
Şayet PBP klasöründeki dosyaları değiştirmese idin bu hataları alacaktın. Demekki MCS başka bir yei kullanıyor.
Sakınmakinanda iki ayrı basic klasörü olmasın?.
Bu duurmda MCS de View menüsünü aç Compile & Program Options'u seç bakalım ekrana ne geliyor.
Compiler etiketi altında C:\PBP gibi bir path (yol) gelmesi gerek ne yazıyor orada. Senin değişiklik yaptığın klasörle aynımıdır?

Ete
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 04 Ocak 2011, 14:42:06
Hocam ben ben PBP yi MCS klasörünün içine kurmuşum. C:\Program Files\mecanique\PBP  Ben bi aralar yine 18F252 ile yapmaya çalışmıştım ozaman PBP klasörünün içindeki inc dosyasındaki değişikliği mcs ile değilde not defteri ile yapıp kaydettim. hocam şimdi mcs ve pbp yi komple kaldırıp yeniden yükleyeyim. PBP yi direk c ye mi kurayım yoksa program filesin içinde bi yeremi. Bu arada view menüsünden compile and program optinons sa tıkladığımda compiler adresi doğru yani c:\program files\mecanique\pbp yani doğru yerde Assembler ise proteus dakini kullanıyorum. Acaba mcs yi silip yeniden kurayımmı. 18F452 ile derleme yapabiliyorum onda sorun olmuyor. 18F452 nin konfigürasyon ayarlarını yazıp derleyince sıfır hata ile derliyor.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 04 Ocak 2011, 14:59:42
PBP daima C ana klasöründe olmalıdır.

Birçok işlemci için config ayarları aynıdır. 452 nin kodları ile 252 derleniyorsa tamam demektir.
Bana kalırsa sen yinede 18F252.INC dosyasına bir kere daha bak. Bence config ayarları orada kapatılmamış gözüküyor.

Hatta aynı anda hem 18F452.INC ve hemde 18F252.INC dosyalarına bak neler kapanmış neler kapanmamış.

Ete
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 04 Ocak 2011, 15:24:39
Hocam PBP yi silip yeniden yükledim. C klasöründe şimdi. Ama yine almuyor anlamıyorum hocam bakın bi 18F252 ile 18f452 nin inc dosyalarını veriyorum configürasyon ayarları 18F252 ye göre olmasına rağmen işlemci 18f452 yi seçince derliyor 18f252 yi seçince yine resimdeki hatalardan veriyor.
18F252 nin inc dosyası
;****************************************************************
;*  18F252.INC                                                  *
;*                                                              *
;*  By        : Leonard Zerman, Jeff Schmoyer                   *
;*  Notice    : Copyright (c) 2005 microEngineering Labs, Inc.  *
;*              All Rights Reserved                             *
;*  Date      : 12/16/05                                        *
;*  Version   : 2.47                                            *
;*  Notes     :                                                 *
;****************************************************************
        NOLIST
    ifdef PM_USED
        LIST
        "Error: PM does not support this device.  Use MPASM."
        NOLIST
    else
        LIST
        LIST p = 18F252, r = dec, w = -311, w = -230, f = inhx32
        INCLUDE "P18F252.INC"   ; MPASM  Header
;        __CONFIG    _CONFIG1H, _OSCS_OFF_1H & _XT_OSC_1H
;        __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
;        __CONFIG    _CONFIG4L, _LVP_OFF_4L
        NOLIST
    endif
        LIST
EEPROM_START EQU 0F00000h
BLOCK_SIZE EQU 8


18F452 nin inc dosyası
;****************************************************************
;*  18F452.INC                                                  *
;*                                                              *
;*  By        : Leonard Zerman, Jeff Schmoyer                   *
;*  Notice    : Copyright (c) 2005 microEngineering Labs, Inc.  *
;*              All Rights Reserved                             *
;*  Date      : 12/16/05                                        *
;*  Version   : 2.47                                            *
;*  Notes     :                                                 *
;****************************************************************
        NOLIST
    ifdef PM_USED
        LIST
        "Error: PM does not support this device.  Use MPASM."
        NOLIST
    else
        LIST
        LIST p = 18F452, r = dec, w = -311, w = -230, f = inhx32
        INCLUDE "P18F452.INC"   ; MPASM  Header
;        __CONFIG    _CONFIG1H, _OSCS_OFF_1H & _XT_OSC_1H
;        __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
;        __CONFIG    _CONFIG4L, _LVP_OFF_4L
        NOLIST
    endif
        LIST
EEPROM_START EQU 0F00000h
BLOCK_SIZE EQU 8


Ayni işlemi 18F258 ile de denedim aynı hatayı veriyor.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 04 Ocak 2011, 15:28:40
18F452 de o satırları tamamen çıkarmışsın. Aynı işlemi 252 içinde yap bakalım ne olacak. Muhtemelen koyduğun noktalı virgül tanımlanmıyor.

Ete

not: yanlış görmüşüm alt tarafa bakmamışım. Haklısın ikisinde de ; var.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 04 Ocak 2011, 15:36:19
Tamamen kalıdırmışsınız derken nasıl yani hocam. Aynı şekilde ikisindede noktalı virgül var.
Acaba kesme işareti koysam olurmu " ' "
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 04 Ocak 2011, 15:42:24
18F452.INC  dosyasında config satırları silinmiş gibi geldi bana. Yukarıdaki mesajına bak istersen.
Ete
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 04 Ocak 2011, 15:46:19
Hocam baktımda Ben hala ikisi arasında fark göremiyorum. Hocam birde siz kendi kullandığınız 18f252.inc dosyasını verseniz. Daha nereye bakıcağımı şaşırdım resmen
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 04 Ocak 2011, 15:47:42
Dosyanın altında daha satırlar varmış.
neyse benim dosya

;****************************************************************
;*  18F252.INC                                                  *
;*                                                              *
;*  By        : Leonard Zerman, Jeff Schmoyer                   *
;*  Notice    : Copyright (c) 2005 microEngineering Labs, Inc.  *
;*              All Rights Reserved                             *
;*  Date      : 12/16/05                                        *
;*  Version   : 2.47                                            *
;*  Notes     :                                                 *
;****************************************************************
        NOLIST
    ifdef PM_USED
        LIST
        "Error: PM does not support this device.  Use MPASM."
        NOLIST
    else
        LIST
        LIST p = 18F252, r = dec, w = -311, w = -230, f = inhx32
        INCLUDE "P18F252.INC"   ; MPASM  Header
;        __CONFIG    _CONFIG1H, _OSCS_OFF_1H & _XT_OSC_1H
;        __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
;        __CONFIG    _CONFIG4L, _LVP_OFF_4L
        NOLIST
    endif
        LIST
EEPROM_START EQU 0F00000h
BLOCK_SIZE EQU 8
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 04 Ocak 2011, 15:55:28
Anlamıyorum  hocam
Sizin verdiğiniz klasörüde denedim olmadı bunun ne sebebi olabilir.
Derlerken hiç derleme ekranıda  gelmiyor. Sanki hatalı kod yazılmış gibi hiç derlemeden resimdeki gibi bazı kodları bordo rengini alıyor. Deli olmak üzereyim ???
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 04 Ocak 2011, 16:39:33
Hocam tamam ya şimdi oldu.
Bilgisayardan mcs ile PBP yi tamamiyle kadırıp yeniden yükleyince düzeldi. Regedit kayıtlarınıda sildim.Şimdi düzeldi her ne hikmetse yaptığım düzenlemeler yine aynı yani inc klasöründe bi farklılık yok anlamadım gitti.
Yine Allah razı olsun sizden çok yardımınız oldu
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 13 Ocak 2011, 20:52:05
Merhabalar ete hocam.
Hocam sizin Expkits için hazırlamış olduğunuz grafi lcd kodlarıyla uğraşıyorum. Pic basicde şimdiye kadar hiç GLCD kullanımına örnek görmedim.Zaten kime sorsam zor diyor. Sizin kodları inceliyorum. Programa bakarak 16F877A için yapılmış olan için bir şema hazırladım. LCD ekrandaanlamsız şeyler çıkıyor düzgün çalışmıyor. Normalde Expkits 8Bİg yazması gerekiyor galiba .Simülasyonda Birtek G harfi düzgün çıkıyor. Ve ekranda hareket eden şeyler var.
Neyse Asıl konum bu değil. Mantık olarak anlamadığım noktalar var. İlk önce GLCD nasıl sürülür bunu tam olarak bilmmem gerekiyor anlamam için RS ve E ucları hangi durumlarda 1 veya 0 oluyor. Görevleri nelerdir bilmem gerekir.
En basitinden grafik lcd'nin sol üst köşesine (0,0) bir nokta koymak için hangi işlemler izlenilmeli. Biraz bu konuda çalışmalar yapmak istiyorum.
Birde grafik lcd de adresleme nasıl yapılıyor bunları bilmiyorum. Diyelim 8. satır,68. sütüna 1 nokta koyacam. Adreslemeyi nasıl yapmam gerekiyor. Bu konuda biraz yardımlarınıza ihtiyacım var. İşin mantığını kavramak için en azında ufak bir program yazmam lazım. Nereden başlamalıyım. Yardımcı olursanız sevinirim.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 13 Ocak 2011, 21:38:17
Bu sorularına yarın cevap vermeye çalışacağım. Aradan zaman geçti hatırlayabilirsem yada data sheet bulabilirsem hepsi orada yazıyor. Bende data sheete bakarak yapmıştım.

Aslında çok zor bir mantık değil. Sİstemin prensibi üst sol köşeden itibaren ekranı yukarıdan aşağıya 8 er noktalık sütünlar halinde düşün. En sol köşeden aşağıya doğru 8 adet nokta ilk sütun ve ilk satır oluyor. Şayet oraya tek nokta (en üst ve ensol köşe) koymak istersen oraya yazacağın bilgi 1 olacaktır. Şayet aynı yere üst üste 2 nokta yazmakistersen yazman gereken bilgi 3 olacak ilk noktanın altına tek nokta koymak istersen yazman gereken bilgi 2 olacaktır. Böylece soldan sağa 64 sütün bir seferde ve her sütün (ilk sıra için) 8 bit olarak kontrol ediliyor. Kursorü 2. satıra alırsan aynı işlemleri bu seferde 2. satır olarak yapabiliyorsun. Bu tekniğe uygun resimleri (aynen diğer LCD de karekter oluşturur gibi) oluşturup oluşan satır ve sütun bilgilerini LCD ye yolluyorsun. Adreslemeyi benim pogramda detaylıolarak görebilmen lazım. Açıklamalarda koymuştum.
Ete
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 13 Ocak 2011, 22:50:25
Hocam forumda bu konuda pek çok açıklama yapmışsınız. Aslında bu kadar yazılanlardan sonra konuyu tekrar dile getirmem gerekirdi.  Ama anlaşırması zor bir konu.
Diğer konularda da bazı örnekler vermişsiniz. Bunlarla sizin expkits için yazdığınız programları inceleyerek bişeyler yapamaya çalışıyorum.
Şimdi grafik lcd nin çalıştırılması için yapılması gerekenler anladığım kadarıyla şöyle olmalı;
Kullandığım lcd winstarın WG12864B lcd si
1. si LCD yi açıcağız Bunun için lcd ye $3F (00111111) gönderiyoruz. Ardından enableyi 1 yapıp biraz bekledikten sonra hemen ardından tekrar 0 yapıyoruz.
2. si lcd ye x ve y kordinatlarının başlangıç adreslerini gönderiyoruz. WG12864 ün datasheetini bulamadım ama siz expkits için yazdığınız programda y ekseni için 184, X ekseni için 64 verisi gönderilmeli. Bunlar sıra sıra lcd nin rom adresine kaydediliyor.
3. sü RS bacağı 1 yapılır lcd ye kerana yazılacak bilgi gönderilir. Ardından enable bacağına 1 puls uygulanır. Tekrar RS bacağı 0 yapılır.
Bu noktadan sonra gönderddiğimiz veri lcd ekranda gözükür.
Bununla birlikte ufak bir program yazdım. Bir miktar başarılı oldum  :)
'****************************************************************
'*  Name    : Pr21_GLCD_01.BAS                                  *
'*  Author  : [Ete]                                             *
'*  Notice  : Copyright (c) 2009 [WWW.EXPKITS.com]              *
'*          : All Rights Reserved                               *
'*  Date    : 26.08.2009                                        *
'*  Version : 1.0                                               *
'*  Notes   : Grafik Display Kullanım Örneğidir                 *
'*          :                                                   *
'****************************************************************
'EKRANI 8 X ÇOKLU MATRIS GİBİ DÜŞÜNÜN.
'SATIR=0,SUTUN=0 OLDUĞU ZAMAN EKRANIN EN SOL UST KÖŞESİ,
'YAZILACAK YER OLARAK SEÇİLMİŞ OLUR. BURAYA 1 YAZARSANIZ
'KÖŞEYE BİR NOKTA KOYAR. 3 YAZARSANIZ YUKARDAN AŞAĞI 2
'NOKTA, 7 YAZARSANIZ YUKARDAN AŞAĞI 3 NOKTA 15 YAZARSANIZ
'YUKARDAN AŞAĞI 4 NOKTA YAZAR. 255 YAZARSANIZ YUKARDAN AŞAĞI
'8 NOKTA DOLAYISIYLA 8 NOKTALIK BİR ÇİZGİ YAZAR. TEMEL MANTIK BUDUR.
'HER BİR 8 Lİ NOKTA GURUBU O SATIRDA 1 SUTUN OLUŞTURUR.
'8 Lİ NOKTA GURUBUNDA NOKTALARI YERLEŞTİRME ŞEKLİNİZE GÖRE ORTAYA
'ŞEKİLLER ÇIKARTILABİLİR. BUNUN İÇİN BÜYÜKÇE BİR KARELİ KAĞIT ÜZERİNDE
'ÇALIŞILARAK NOKTALARA KARŞILIK GELEN SAYILAR TESPİT EDİLİP EKRANA YAZDIRILIR.

@ DEVICE pic16F877A 
@ DEVICE pic16F877A, WDT_OFF
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, HS_OSC

DEFINE OSC  20

PortA=0:TrisA=0 'portA yı sıfırladık ve pinleri çıkış olarak ayarladık
PortB=0:TrisB=0 'portB yi sıfırladık ve pinler çıkış olarak ayarlandı
PortC=0:TrisC=0 'portC yi sıfırladık ve pinler çıkış olarak ayarlandı
PortD=0:TrisD=0 'portD yi sıfırladık ve pinleri çıkış olarak ayarladık
PortE=0:TRisE=0 'portE yi sıfırladık ve pinleri çıkış olarak ayarladık
ADCON1=7
             
    X       var byte   
    Y       var byte   
    EK      VAR BYTE   
    BAS     VAR BYTE   
    SON     VAR BYTE     
    SATIR   VAR BYTE    '
    SUTUN   VAR BYTE
    INS CON 63
    YAD CON 184'SATIR BAŞLANGIC ADRESİ
    XAD con 64 'SUTUN BAŞLANGIÇ ADRESİ
    disp_on CON $3f 'LCD yi ac
    disp_off CON $3e 'LCD yi kapat

    symbol ENBL=PORTD.0
    SYMBOL RW  =PORTD.1
    SYMBOL DI  =PORTD.2
    symbol RES =PORTD.3
    SYMBOL CS1 =PORTD.4
    SYMBOL CS2 =PORTD.5
    symbol LCD =PORTB

HIGH RES:LOW RW
PAUSE 100
  EK=3
  ENBL=0   'ENABLE 0 YAPILDI
  CS1=0   'CS1 SEÇİLDİ
  CS2=0   'CS2 SEÇİLDİ
       
  GOSUB LCDAC  'LCD açıldı       
  GOSUB ONAY
  PORTB=(YAD+0) 'X=0 nolu satırda
  GOSUB ONAY
  PORTB=(XAD+0)'Y=80 NOLU SIRADA
  GOSUB ONAY

BASLA:
DI=1
PORTB=%11111110
GOSUB ONAY
DI=0
'----------------------------------------------------------------------------   
'PORTB=%01000110  '2. SATIR 6. SÜTÜN ADRESİ     
'GOSUB ONAY ' ONAY VERİLDİ ADRES VE SATIR BİLGİSİ AKTARILDI.
'DI=1
'PORTB=%11100111 'EKRANDA YUKARIDAN AŞAĞIYA ...  ...  ŞEKLİNDE BİR ŞEKİL ÇIKACAK         
'GOSUB ONAY   
'DI=0 

END

ONAY:
    ENBL=1:PAUSEUS 10:ENBL=0
    return

LCDAC:
      rw=0 :di=0 :PORTB=disp_on :gosub onay ' lcd açma
      return
LCDKAPAT:
         rw=0 :di=0 :PORTB=disp_off :gosub onay ' lcd kapatma
         return

   
   

Hocam yazdığım kodlar bunlar isis simülasyonunda çalışıyor.
LCD ekranın 1. satır 1 sütün ve 1. satır galiba 80. sütüna nokta koyuyor. Yanlız ekran tersenmiş halde çıkıyor Bunu anlamadım. Acaba doğru yoldamı ilerliyorum hataların nelerdir. Hocam Atladığım şeyler varmı

Hocam yaptığım çalışmalar burada bi bakın isterseniz.
http://hotfile.com/dl/96559806/2f0f042/GLCD_16F877-20.rar.html
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 14 Ocak 2011, 12:35:30
Bütn yaptıklarına bakacak kadar vaktim yok maalesef.  Yalnızca işin nasıl yapılması gerektiğini epeyce açıkladığımı bir kere daha belirtmek isterim. Zaten açıklamalar biraz işe yaramışki sende bir şeyler ortaya koymaya başladın. Anlamak ve uygulamak zor değil.
Ben bu konuya başlarken en populer GLCD entegresi olarak bilinen K0108B nin data sheetini ineceleyerek yola çıkmış idim.
http://pdf1.alldatasheet.com/datasheet-pdf/view/37323/SAMSUNG/KS0108B.html
Bu data sheet de 13. cü sayfada "DISPLAY CONTROL INSTRUCTION" şeklinde bir tablo var ve her şey orada detaylı şekilde görülüyor.
İngilizce bilmek gerekmiyor. Satır başlıklarını tercüme edin yeterli.  Her bir işlem için bağlantı pinlerinin alması gereken değerleri (High-Low) olarak adamlar vermişler. Mesela ilk sırada yer alan Display On/off yani displayi aç kapa işlemi için hemen sağ tarafa bakman yeterli. Orada RS bacağı LOW, RW bacağı Low, DB7 (data bacağı) ve DB6 bacaklarının LOW diğerlerinin High yapılacağı gösterilmektedir.
Ne bileyim X adresi (Satır) girme Y adresi (sütun) girmek için ne yapılacağı gösterilmiş. Bende açıklamalarımda bu komutların rakam karşılıklarını vermişim. Olay budur. Gerisi tamamen el işçiliği. Yani karekterleri bitmap olarak oluşturma işinden ibaret.
Bu arada yapmadığım ama yapılmasının zor olmadığını düşündüğüm herhangi bir bitmap resim dosyasının ekrana aktarılması işide çok zor değil. Ekranın en süt sol köşesi adreslenip sonradan gelen bütün bilgi sırası ile ekrana yerleştirilirse resim otomatik oalrak ekrana yerleşecektir. Tabiiki zorlukları var ama bütün işin adresleme işi olacağını unutma. BAzı programlar var. Bitmap tabanlı resimlerden sana data çıkartıyor. Bu datalarıda adresleyip verdiğinde resim ekrana yerleşmiş oluyor. Gayet kolay. Onunla ilgili örneklerde yapmıştım ama nerelerdedir bilmiyorum. Bulursam veririm.

Kolay Gelsin
Ete,
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 14 Ocak 2011, 18:49:33
Hocam yavaş yavaş çözüyorum işi :) İşin mantığını anladım sayılır.
Şimdi lcd de istediğim noktaya nokta koyabiliyorum.RS ve E bacaklarının lcd de işlevini öğrendim.
anlamadığım nokta Lcd de ne yapsam terslenmiş halde çıkıyor. Yani lcd nin tümü siyah nokta koyduğum yerler beyaz oluyor. Bunun ayarlandığı bir registermi var.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 14 Ocak 2011, 21:32:23
Bu kullandığın LCD ile ilgili bir sorun olsa gerek. Bu konuda birşey hatırlayamadım. Şayet kullandığın mavi ekran ise bunlar zaten invert olarak çalışıyorlar. Yazılar beyaz yada noktalar beyaz fon mavi olarak çalışıyor.

Ete
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 14 Ocak 2011, 21:37:31
Hocam daha yazdığım programları gerçek hayatta denemedi. Simülasyonda denedim. Simülasyonda kullandığım lcd modeli AMPİRE12864   ks108 kontrollü..
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 17 Ocak 2011, 20:31:45
Merhabalar ete hocam.
Epeyi bi uğraştım Şimdi aklıma yatıyor herşey.
Expkits için yazdığınız programla ilgili bir iki sorum olacaktı;
Acaba siz harf datalarını nasıl oluşturdunuz.Her harf için teker teker ellemi oluşturdunuz. Ben böyle teker teker dataları elle yazarak F,R,H harflerini oluşturdum. Sorun yok oluşturduğum datalarda fakat bu şekilde oluşturmak işkence gibi çok zamanımı alıyor. Bunun daha kolay bir yolu varmı.

Protonda glcd ile bir iki resim basma uygulaması yapmıştım. Protonda GLCD kullanımı çok basit.
Belki duymuşsunuzdur FastLCD diye bir program var. Buprogram ile GLC üzerinde pixel tabanlı çalışmalar yapabiliyor geometrik şekiller çizebiliyor fontlu yazlıar oluşturabiliyoruz. Sonra fast lcd de yaptığımız çalışmayı Bmp olarak kaydedip pixelv[1].2 programıyla Basdosyasına ve glcd datalarının olduğu inc dosyayına çevirebiliyoruz.
Pixel1.2 ninproton için oluşturduğu örnek bir program. Bu kadar komutla lcd ye resim basabiliyorun

Dim  Xpos    As Byte
Dim  Ypos    As Byte
Dim  Addr    As Word
Dim  char    As Byte



START:

     For Ypos = 0 To 7
         For Xpos = 0 To 127

             Addr = (Ypos*128)+Xpos
             Char = Cread elektro+Addr
             LcdWrite Ypos,Xpos,[Char]
         Next
     Next

     DelayMs 100

     Goto    START


Include  "elektro.inc"

Gerisi Programa kalmış. Şimdi Pic basicde GLC komutu yok bu yüzden proton için oluşturulmuş basdosyasını basic'e uygulamak biraz zor olur. Benim merak ettiğim Dataların olduğu inc dosyasını nasıl basicde uygulayabilirim. Eğer bunu başarabilirsembasicde çok güzel uygulamalar çıkarabilirim.

Mesela örnek bir pixel1.2 ile yaptığım bir çalışma ile oluşturduğum dataları vereyim.

elektro:
CDATA   $00,$00,$00,$C0,$C0,$60,$20,$30,$10,$10,$F0,$F0,$F0,$00,$00,$00
CDATA   $00,$00,$00,$80,$C0,$E0,$F0,$F8,$18,$00,$00,$00,$C0,$60,$20,$30
CDATA   $10,$90,$F0,$F0,$70,$10,$00,$00,$00,$00,$00,$00,$00,$06,$FE,$FC
CDATA   $00,$00,$00,$00,$00,$80,$C0,$60,$20,$30,$10,$10,$10,$30,$F0,$F0
CDATA   $60,$00,$00,$00,$00,$10,$90,$F0,$F0,$30,$10,$10,$10,$80,$40,$20
CDATA   $20,$30,$10,$10,$10,$F0,$F0,$F0,$10,$10,$10,$10,$10,$1C,$1C,$0C
CDATA   $00,$00,$00,$00,$00,$00,$80,$C0,$60,$30,$10,$10,$30,$F0,$E0,$C0
CDATA   $00,$00,$00,$00,$40,$60,$20,$30,$10,$10,$F0,$F0,$E0,$00,$00,$00
CDATA   $00,$00,$0F,$1F,$18,$00,$00,$00,$C0,$FE,$3F,$1F,$FF,$FE,$80,$C0
CDATA   $F0,$3C,$1E,$F7,$FF,$FF,$0F,$00,$00,$00,$00,$07,$07,$06,$00,$F0
CDATA   $FE,$FF,$0F,$01,$00,$00,$00,$00,$00,$00,$00,$C0,$E0,$3C,$0F,$01
CDATA   $00,$E0,$F8,$FE,$1F,$03,$01,$00,$00,$00,$00,$00,$00,$00,$03,$03
CDATA   $00,$00,$00,$00,$C0,$F8,$FF,$3F,$03,$00,$00,$00,$0F,$1F,$18,$00
CDATA   $00,$00,$00,$E0,$FE,$FF,$1F,$01,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$80,$C0,$60,$30,$3C,$1F,$07,$03
CDATA   $00,$00,$00,$00,$00,$00,$04,$04,$06,$0F,$FF,$FD,$F8,$00,$00,$00
CDATA   $00,$30,$30,$30,$30,$38,$1C,$0F,$07,$01,$00,$00,$3F,$3F,$0F,$03
CDATA   $00,$10,$1E,$1F,$1F,$10,$10,$10,$10,$00,$00,$00,$00,$00,$00,$03
CDATA   $0F,$1F,$1E,$1C,$18,$18,$18,$0C,$0C,$06,$07,$03,$00,$00,$00,$00
CDATA   $00,$0F,$3F,$7F,$70,$C0,$C0,$80,$80,$C0,$40,$60,$30,$10,$00,$00
CDATA   $10,$10,$18,$1C,$1F,$1F,$13,$10,$10,$00,$00,$00,$00,$00,$00,$10
CDATA   $10,$18,$1E,$1F,$1F,$11,$10,$10,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$10,$18,$1C,$1E,$1B,$19,$18,$18,$18,$1C,$0E,$02,$00
CDATA   $00,$0C,$1C,$1C,$18,$10,$10,$18,$0C,$07,$03,$01,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$08
CDATA   $78,$88,$00,$88,$78,$88,$00,$C8,$38,$08,$08,$78,$88,$00,$88,$78
CDATA   $88,$00,$C8,$38,$08,$08,$78,$88,$00,$88,$78,$88,$00,$C8,$38,$08
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$40,$C0,$40,$40,$40,$C0,$00,$40,$C0,$40,$00,$00,$00
CDATA   $00,$40,$C0,$40,$40,$40,$C0,$00,$40,$C0,$40,$00,$00,$C0,$40,$40
CDATA   $00,$C3,$4E,$41,$C0,$43,$4E,$C1,$00,$40,$C0,$40,$43,$4E,$81,$00
CDATA   $03,$0E,$81,$40,$40,$40,$40,$83,$0E,$01,$40,$C3,$4E,$41,$40,$80
CDATA   $00,$00,$00,$40,$00,$40,$C0,$40,$00,$00,$00,$00,$00,$40,$00,$40
CDATA   $C0,$C0,$00,$00,$00,$00,$00,$C0,$C0,$40,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$40,$7F,$44,$44,$4E,$40,$20,$40,$7F,$40,$40,$40,$40
CDATA   $20,$40,$7F,$44,$44,$4E,$40,$20,$40,$7F,$44,$0A,$11,$60,$40,$40
CDATA   $00,$00,$00,$40,$7F,$40,$00,$00,$00,$40,$7F,$44,$04,$1C,$23,$40
CDATA   $40,$1F,$20,$40,$40,$40,$40,$20,$1F,$00,$40,$7F,$44,$44,$44,$47
CDATA   $38,$00,$42,$7E,$40,$40,$7F,$40,$40,$40,$40,$20,$42,$7E,$40,$40
CDATA   $7F,$40,$03,$1C,$60,$1C,$03,$40,$7F,$40,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$F8,$04,$02,$02,$02,$02,$04,$F8,$00,$02,$FE,$22,$22
CDATA   $E2,$1C,$00,$00,$F8,$04,$02,$02,$02,$24,$EE,$20,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$01,$02,$02,$02,$02,$01,$00,$00,$02,$03,$02,$00
CDATA   $00,$01,$02,$02,$00,$01,$02,$02,$02,$02,$01,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
CDATA   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00


Acaba lcd de başlangıç adreslerini belirttikten sonra for döngüsüyle bu dataları basabilirmiyim. Ne düşünüyorunuz bu konuda

Birde şu lcd de ne yapıyorsam tersi çıkıyor bunu bi türlü çözemedim ???
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 17 Ocak 2011, 21:00:02
Sonuçta sana karekter data sı gerekiyor.Bunu ister elle ister programla yap. Ama data elinde olunca başlangıç adresini verip ekrana yerleştir.
Geçen yıl benzer şekilde bir Grafik ekrana vermiştim. Sende yapabilirsin.
Ete
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: Mucit23 - 20 Ocak 2011, 09:35:46
Merhabalar ETE hocam
Hocam Bu sulama cihazında yeni bir sistem tasarlamak istiyorum. Biraz kapsamlı bir cihaz yapmayı düşnüyorum.
Tasarım hakkında bazı sorunlarım var.
Sistemi endüstride çalışabilecek hale getirecem. yani koruyucu donanımları arttıracam. LCD ekranı büyütecem.(4x20 kullanmayı düşünüyorum.) ve yazılımdada bir sürü değişiklikler var aklımda.
Bununla ilgi bir sorunum var tasarımla ilgili. LCD ekranın en üst satırında bir kayan yazı yapmayı düşünüyorum. Sistem durumu hakkında bazı bilgiler verecek. Bir miktar çalışma yaptım. LCD ekranda sabit yazıları kaydırabiliyorum. Yapamadığım şey ise LCD ekranda sabit yazılarla birlikte değişkenler içerisindeki sayısal değerleride kaydırmak. Bunu yapamadım. Yani değişkenler içerisindeki bilgiler değişebilir. Ekrana yansıtmaya gelince tıkandım kaldım.
Buradada konu açmışım
https://www.picproje.org/index.php/topic,31441.msg219354/topicseen.html#msg219354
Bazı arkadaşlar sağolsunlar yardım etmeye çalışıyorlar. Sizin pic basicde algoritmanızın gerçekten gelişmiş olduğunu düşünerek sizede bi soryım dedim.
Bunun en mantıklı şekilde nasıl yapabilirim.
Linkte bi kod paylaşmışım. (aslında o kodlarda bana ait değil) O verdiğim kodlarla sabit yazıları kaydırabiliyorum.
Sorunum sayısal değerleri kaydırma.Örneğin ds302 den aldığım saat bilgisini Nasıl ekranda kayar hale getirebilirim. Bu konuda yardımcı olursanız sevinirim.
Başlık: Ynt: bir butonla bir ledi yakıp söndürmek
Gönderen: ete - 20 Ocak 2011, 09:45:41
Kaydırma konusundaki mesajları bu sabah gördüm. Cevap yazacaktım biraz işim vardı onları hallettikten sonra yazarım diye düşünüyordumki bu mesajın geldi.
Tek bir şey söyleyeceğim. Mantıken ekrana yazılacak yeri kursorün konumu belirler. Yani önce ekraqnda adres verirsin sonra yaz dediğin zaman alet oraya yazar. Yada senin yaptığın gibi her yazılan karekterden sonra yazılacak konum pozisyonu otomatik olarak bir artırılır.
Şimdi ALI=23 yazdırmak için biz ne yapıyoruz? 23 sayısı değişkende (SAYI) tutulduğunu düşünürsen;
LCDOUT $Fe,$C0,"ALI=",dec SAYI dedinmiydi ALI=23 sayısı ekrana yazılır. Peki aşağıdaki komut ne yapar;
LCDOUT $FE,$CA,"ALI=1,dec SAYI  , tabiiki Soldan itibaren 10 hane ötesine ALI=23 yazacaktır. Bu mantığı kullanarak istediğin şekli yazdırabilirsin diye düşünüyorum. Bence Poz diye bir değişken tanımla. Başlangıç değeri 19 olsun.
LCDOUT $fe,($C0+POZ),"ALI=",dec SAYI dersen ve her defasında POZ=POZ-1 yaparsan ekrandaki ALI=23 ifadesi sağdan sola doğru yavaş yavaş kayacaktır.
İLk aklıma gelen buydu. Tabiiki ALI= ifadesi için yine yaptığın şekilde bir lookup tablosu kullanılabilir. Farklı ifadeler için farklı lookup tablosu yaratılarak hangisi istenirse onu ekrana getirebilirsin.
Aklıma başka bir şey gelirse yazarım.
Ete