G

Yaptığım Devre Çalışmıyor Yardım Lütfen

Başlatan gecekondu, 18 Ekim 2013, 14:41:40

BİDİL


gecekondu

Çok çok teşekkür ederim hepinize yardımlarınız için. :)

gecekondu

Arkadaşlar sanırım söylediğiniz mantık hatalarından dolayı bir problem var.Örneğin bir tuşa basıp bağlı ledi aktif ediyorum ama öteki tuşa bastığım zaman bağlı led anlık yanıyor sonra diğer ledle beraber ikiside sönüyor sorun nerde acaba?

ALICI:

@ __config _XT_OSC & _WDT_OFF & _LVP_OFF & _CP_OFF
DEFINE OSC 4
Include "modedefs.bas"
cmcon=7
adcon1=7
DEFINE LCD_DREG PORTC
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
TRISE=%00000010
PORTE=1
PORTB=0
TRISB=%00000000
TRISD=%00000000
portd=0
TRISC=%00000000
PORTC=0
TRISA=%00000000
PORTA=0




AL VAR byte

lcdout $fe,1,"Sistem Acik"

basla:

serin2 porte.1,396,[WAIT ("M","U","S","T","A","F","A","Y"),al]
serin2 porte.1,396,[WAIT ("M","U","S","T","A","F","A","L"),al]
serin2 porte.1,396,[WAIT ("M","U","S","T","A","F","A","T"),al]
serin2 porte.1,396,[WAIT ("M","U","S","T","A","F","A","S"),al]
serin2 porte.1,396,[WAIT ("M","U","S","T","A","F","A","N"),al]
serin2 porte.1,396,[WAIT ("M","U","S","T","A","F","A","P"),al]
serin2 porte.1,396,[WAIT ("M","U","S","T","A","F","A","K"),al]
serin2 porte.1,396,[WAIT ("M","U","S","T","A","F","A","O"),al]


if al=10 then
gosub yak
endif

if al=20 then
gosub yak1
endif

if AL=30 then                                                                                       
GOSUB yak2
endif

if AL=40 then
gosub yak3
endif

if AL=50 then
gosub yak4
endif

if AL=60 THEN
gosub yak5
endif
                                         
if AL=70 THEN
gosub yak6
endif

IF AL=80 THEN
GOSUB YAK7
ENDIF

if Portd.0=0 and portc.1=0 and portc.2=0 and portc.3=0 AND Portd.4=0 and portd.5=0 and portd.6=0 AND PORTD.7=0 then
lcdout $fe,1,"Cihazlar Kapali"
ENDIF
goto basla
END

YAK:
TOGGLE portd.0
high portb.0
if portd.0=1 then
lcdout $fe,1,"Derin don. acildi"
else
low portb.0
lcdout $fe,1,"Derin don. kapandi"
endif
return


yak1:
TOGGLE portc.1
high portb.1
if portc.1=1 then
lcdout $fe,1," Buzdolabi acildi "
else
low portb.1
lcdout $fe,1," Buzdolabi kapandi "
endif
return


yak2:
TOGGLE portc.2
high portb.2
if portc.2=1 then
lcdout $fe,1,"DAHILI PRIZ (1)     ACIK"
else
low portb.2
lcdout $fe,1,"DAHILI PRIZ (1)     KAPALI"
endif
return


yak3:
TOGGLE portc.3
high portb.3
if portc.3=1 then
lcdout $fe,1,"Turbo Fan Acildi"
else
low portb.3
lcdout $fe,1,"Turbo Fan Kapandi"
endif
return


yak4:
TOGGLE portd.4
high portb.4
if portd.4=1 then
lcdout $fe,1,"POSET KAPATICI      ACIK"
else
low portb.4
lcdout $fe,1,"POSET KAPATICI      KAPALI"
endif
return


yak5:
TOGGLE portd.5
high portb.5
if portd.5=1 then
lcdout $fe,1,"LED AYDINLATMA      ACIK"
else
low portb.5
lcdout $fe,1,"LED AYDINLATMA      KAPALI"
endif
return


yak6:
TOGGLE portd.6
high portb.6
if portd.6=1 then
lcdout $fe,1,"DAHILI PRIZ (2)     ACIK"
else
low portb.6
lcdout $fe,1,"DAHILI PRIZ (2)     KAPALI"
endif
return


yak7:
TOGGLE portd.7
high portB.7
if portd.7=1 then
lcdout $fe,1,"DAHILI PRIZ (3)     ACIK"
else
low portB.7
lcdout $fe,1,"DAHILI PRIZ (3)     KAPALI"
endif
return


VERİCİ:

@ __config _XT_OSC & _WDT_OFF & _CP_OFF
DEFINE OSC 4
Include "modedefs.bas"
AL var byte
AL=0
TRISA=%00000000
PORTA=0
TRISB=%11111111
PORTB=1

Basla:

if portb.0=0 then
AL=10                                   
gosub ilet
pause 30
endif



if portb.1=0 then
AL=20
gosub ilet
pause 30
endif


if portb.2=0 then
AL=30
pause 30
gosub ilet
ENDif

if portb.3=0 then
AL=40
pause 30
gosub ilet
endif

if portb.4=0 then
AL=50
pause 30
gosub ilet
endif

if portb.5=0 then
AL=60
pause 30
gosub ilet
endif

if portb.6=0 then
AL=70
pause 30
gosub ilet
endif                                 

if portb.7=0 then
AL=80                 
pause 30
gosub ilet
endif


goto basla
end
ilet:
SEROUT2 PORTA.2,396,["M","U","S","T","A","F","A","Y",AL]
SEROUT2 PORTA.2,396,["M","U","S","T","A","F","A","L",AL]
SEROUT2 PORTA.2,396,["M","U","S","T","A","F","A","T",AL]
SEROUT2 PORTA.2,396,["M","U","S","T","A","F","A","S",AL]
SEROUT2 PORTA.2,396,["M","U","S","T","A","F","A","N",AL]
SEROUT2 PORTA.2,396,["M","U","S","T","A","F","A","P",AL]
SEROUT2 PORTA.2,396,["M","U","S","T","A","F","A","K",AL]
SEROUT2 PORTA.2,396,["M","U","S","T","A","F","A","O",AL]

RETURN

BİDİL

#48
ledler hangisi portd mi yoksa portb mi

MS_59

yolladığın programları düzenlemeye çalıştım umarım istediğin gibi olmuştur dosyalar ektedir.
mehmet

ete

#50
Programlar yanlış değil ama bir çok lüzüumsuz komut yazılmış. Bazı şeylerde eksik.
Bende bir takım olması gereken düzenlemeler yaptım. Simulasyonda kusursuz çalışıyor.
Ancak daha öncede belirtildiği üzere sistemde IR aktarma kullanılıyor ise şunlar unutulmamalıdır.
IR_Verici data bilgisini 38 Khz üzerine bindirirken sinyal terslenir. Ancak senin bu şemanı göremedim.
Çift transistör kullanılırsa terslenmez elbette. Hadi diyelimki terslendi. Alıcıda IR göz de, bilgiyi alırken tersler.
Şayet verici terslemiş ise alıcıda tersleyeceği için sonuçta data doğrulmuş olur. Bu nedenle komutlara dokunmadan bu şekli ile bir denemek gerek. Olmuyor ise mutlaka alıcı verici şemalarını buraya eklemen lazım.

Kusurlarıda açıklayayımda takip edenlere yardımı olur belki.
1. Sigorta ayarlarını mutlaka programa dahil edin. Bu sizi hata yapmaktan kurtarır. Programcı üzerinde sigorta ayarı yapmak hem unutulanbir iş hemde bazen külfet haline gelen bir iştir.
2. B portunu tuş için kullanıyor ve pullup yapılmış tuş kullanıyorsanız mutlaka dahili pullup ları kullanın.
3. Her program mutlaka bir açılış gecikmesi ister. İŞlemciye ilk voltaj verildiği zaman her şeyi ile hazır olup hemen çalışmaya başlayamaz. Onunda yapacağı işler vardır. Örneğin tanımladığınız register değerlerini öncelikle düzenlemek , değişkenleri iligli adreslerine yerleştirip değerlerini sıfırlamak, LCD kullanılıyor ise onun kendi registerlerini ayarlamak gibi işler an azından 200 ms zaman alır. Bu gecikmeyi vermezseniz program yarım yapamalak başlayabilir. Bu nedenle başla satırından evvel programa en azından 200 ms lik bir gecikme verin.
4. Tris registerlerini ayarlarken mutlaka ilgili portu sıfırlayın. Zira port bitleri açılışta rastgele değerler alırlar. Ama sıfırlarsanız sıfır ile başlarlar. Özellikle röle vs gibi elemanların bağlı olduğu portları başlangıçta sıfırlayın.
5. Programda  SEROUT komutu kullanılıyor ise başla satırından evvel boş bir serout yollayın. Bu sistemi aktive etmek açısından bazen önemli olur. Yollama ve alma komutlarında işaretçi olarak 3 karekterden fazlasını kullanmayın. Aksi halde komut boşu boşuna programınızı yavaşlatır ve hata yapma ihtimalinide artırır.
6. Yollama komutlarının önünde mutlaka uyandırma bilgisi yollayın. Buda programın alma işleminde hata ihtimalini azaltır.
7. Yollama komutları SEROUT olarak kullanılıyor ise 1 veya 2 adedi geçmemelidir. HSEROUT kullanılıyor ise yalnızca bir kere yollanması yeterlidir.
8. Alma komutları yalnızca 1 adet olmalıdır. Özellikle SERIN komutlarının her biri programı en azından  65535 ms beklettiğini unutmayın.
9. Tuş kontrollerinde tuşa bir kere basıldımı bırakılıncaya kadar başka komut yollanmamalıdır. Bunu While TUS=0:WEND şeklinde önleyebilirsiniz. Tuşun bırakılmasını takiben yaklaşık 20 ms lik bir gecikme vererek tuş titremesi denilen ve bir anda kontakların birden fazla temas edilip açılma (debouncing) olayını önlemiş olursunuz.
10. ALıcıda , YAK (veya diğerlerine) balıldığında bir yanlış uygulama göreceksiniz.
      TOGGLE PORTD.0  komutu verilip hemen ardından HIGH PORTB.0 denilmiş. Halbuki bu pinin high olması PortD.0 pininin high olmasına bağlıdır. Bu nedenle bu şekildeki kullanılılış biçimi yanlış olur. İki türlü doğru kullanım olabilir. Bunlar,
    a) Toggle portD.0 denildikten sonra  PORTB.0=PORTD.0 denilebilir. Zira PORTB.0 pini PortD.0 ile paralel çalışmaktadır.
    b) Yada PORTB.0'a değer vermeden PortD.0 pininin durumu test edilmeli ona göre değer verilmelidir. Ben bu ikinci alternatifi tercih ettim. Ama a şıkkındaki de daha kısa kod üretir ve doğru çalışır. Böylece PORTD.0=1 ise PORTB.0=1 olmalı yada tersi yapılmalıdır.
11. Alma işleminde alınan bilgi ye göre işlem yapıldıktan sonra AL değişkeni sıfırlanmalıdır. Aksi halde hata oluşabilir.
Aynı şekilde yollama işleminde de bilgi yollandıktan sonra sıfırlanmalıdır.
12. Cihaz kapalı ikazı verilirken PortD.0 ın HIGH olması durumu unutlulmuş. Bu yüzden hepsini kapatmış olsanız bile cihaz kapalı ikazını veremiyor idi. Ayrıca her bir pin için bir AND işlemi yapmaktansa bütün portu değerlendirmek daha akılcı olur idi.
Diğer taraftan SERIN komutu programı 65 ms dolayında beklettiği için ikazı hemen başla satırından evvel vermeyi uygun gördüm. Ayrıca xxx cihaz kapandı ikazı da görülebilsin diye ondan öncede 500 ms lik bir gecikme ekledim. Bunlar çalışmayı etkilememektedir.
Cihazların açık yada kapalı olma durumunu ;
IF (PORTC & %00001110)=0 AND (PORTD & %11110001)=0 THEN lcdout $fe,1,"Cihazlar Kapali"
komutu ile yaptım.  (PORTC & %00001110) komutunu ele alır isek PORTC pinlerini %00001110 bitleri ile karşılaştırıyoruz. Karşılaştırmada 1 verdiğimiz bitler aktif olan bitler olup sıfır olanlar karşılaştırmaya dahil etmediğimiz bitler oluyor. Bunlardan herhangi birisi C portunda 1 ise sonuç sıfırdan büyük olacağı için cihazlardan birisi açık anlamına gelir. Ama hepsi sıfır ise sonuçta sıfır olacağı çin kapalı cihaz anlamına gelecektir. Aynı şeyi D portu içinde yapıp her ikisinin sonucu sıfır ise cihazlar kapalıdır deyip ikazımızı veriyoruz. Bu şekilde komut daha anlaşılır olmaktadır.

13. Include "modedefs.bas" komutu yalnızca SERIN yada SEROUT komutu için kullanılabilir. Bu nedenle lüzumsuz komut olup bunları her iki programdanda kaldırdım.

Ete

gecekondu

#51
Sayın ete verdiğiniz bilgiler için çok teşekkür ederim.Alıcı verici şemasını antrak sitesinden almıştım.
Şöyle ki:

http://www.elektroniksanac.4t.com/alici_verici.html

Ben alıcı olarak TK19 kullandım bacak bağlantılarıda 3 data,2 +5V,1 GND şeklinde yaptım.Yalnız verici led'e baktığım zaman sürekli açık halde olduğunu görüyorum ve şuana kadar uğraşmamada kadar çalışmadı.Alıcıda serin2 komutunun baud hızını 16780 olarak ayarladım.Pot ile ayarlayarak çıkışı bakıyorum ama butona basıp şase-ouyt arasının sıfırlanmadığını görüyorum.

zeus48


gecekondu

Merhaba Sayın zeus,

Dün konuştuğumuz gibi şaseleri aldık birleştirdik çalıştı şu an kendi kodlarımla bakıyorum hani yak söndür işlemlerinin tamamını yapıyorum fakat ledlerin butonlara basılıp hepsi yandığında birden hepsi kapanıyor.Onu çözmeye çalışıyorum.Bir de işte IR alıcı verici sıkıntım var.Ben devre olarak şu şemayı kullanmıştım : http://www.elektroniksanac.4t.com/alici_verici.html

Birincisi IR led sürekli yanıyor.İkinciside TK19 'un out-şase arasında butona basılınca bir değişme olmuyor.Bakıyorum işte öyle :D

ete

Şemaya bakılınca, Vericide data terslenmiyor. Oradan doğru çıkıyor. Ancak senin gerçekten 38Khz lik bir sinyale bindirme yapıp yapmadığını çok iyi test etmen gerek.
Sistem doğru veriyor ise gelen data IR gözde terslenmesi gerekir. IR göz çıkışı HIGH da bekler Infrared led yanınca çıkış LOW olur. Bu durumda alıcıda SERIN komutunda 396 yerine 16780 kullanman gerekir. Neden diye soracak olursan rakam şu şekilde hesaplanıyor.
Rakam=(1.000.000/Baud)-20  buradan Rakam=1000000/2400-20=396 olarak bulunuyor.
Aslında 15 bitlik bir değer olan bu sayının 14. biti sıfır ise data true yani terslenmemiş, bir ise terslenmiş olarak alınır.
Bu durumda 15 bitlik (0-14) sayının yalnızca 14. biti 1 ise o sayı 16384 dür. O halde bizim sayı 16384+396=16780 olmalıdır.

Yalnızca alıcı kısımda SERIN2 komutundaki rakamı 16780 yapman yeterli olacaktır. Bu şekilde dene bakalım.
Unutma TK19 IR göz sınıf adıdır. Bunun 36 Khz likden tut da 54 Khz'e kadar modelleri vardır ve hepsi TK19 diye geçer. Alırken göz mutlaka 38Khz olarak alınmalıdır. Aksi taktirde sistem çalışmaz.

Ete

zeus48

ete hoca sanırım sana hex gönderdi neden onları kullanmıyorsun

zeus48

ır led sadece butona basınca yanması gerekiyor  . ır led sürekli yanması durumunda alıcı bunu gürültü olarak algılayacak çalışmayacak. Yazdıklarından anladığım sanıyorum senin alıcı  farklı   ete hocanında dediği gibi satıcılar bunların hepsini tk 19 diye satıyorlar

zeus48

data aktarımını ır yapmak zorundamısın rf yapalım sana şemada göndereyim yazılımınıda

ete

IR ledin sürekli aktif olmasının sebebi SEROUT2 komutu dur. Çıkış pinini aktif bırkıyor. Bunu önlemek için SEROUT2 komutlarının en sonuna ;
PORTA.2=0 komut satırını ilave etmek yeterli olacaktır.

Ete

zeus48

Haklısın üstad data gönderdikten sonra  o port sürekli 1 de kalıyor sıfırlamak gerek

Powered by EzPortal