2buton ile röle kontrol?

Başlatan mali4242, 27 Nisan 2016, 16:53:44

mali4242

merhabalar arkadaşlar,
AC çıkışlı bir güç kaynağı yapmak istiyorum, trafom hazır 3volt ile 70 volt arası 14 kademe şeklinde sarıldı. çıkışları komitatör ile şeçmek istiyordum fakat 1x14 gibi bir komitatör bulmadım bu yüzden elektronik devre ve röle ile halletme yoluna gittim. pic ve yazılım işinden hiç anlamadığım için yardımınızı rica ediyorum.

temsili çizimde de anlatmak istediğim gibi butonun birine bastıkça ileri, diğeri ile geriye doğru çıkışlar high olacak. aynı anda 2 led yanmayacak şekilde 14 led üzerinde 2 buton ile ileri geri gezinmek istiyorum yani. ledler yerine de transistör ve röle bağlayacağımı anlamışsınızdır zaten. 4017 entegresinin clk ucuna buton bağlayarak yaptım ama sadece bir yöne doğru ilerlenebiliyor. ekteki çizime göre kodları yazarsanız minnettar kalırım. çizimde hatalar olduysa affola.

Maxim

kod için çok daha komplike çözümler üretilebilir fakat ben yer sorunu olmadığı için en sade yöntemi kullandım.
yani if ile yaptım.

ayrıca mclr ucunu mutlaka +5 volta bağlamanız lazım
PORTA.4 çıkışı open collector dür, pull-up direç kullanmadan çıkış alınamaz, o yüzden onu PORTE.0 ile değiştirdim.
ayrıca, butonlar için B portunu kullanır ve pull-up özelliğini açarsanız, extra 2 tane buton direnci kullanmaktan kurtulursunuz.

son olarak, hangi çıkışta kaldığını unutmasın diye koda eeproma yazma komutu eklenebilir, böylece enerji kesip tekrar verdiğinizde kaldığı yerden devam eder.
kodlar proton+ ile yazılmıştır


Device = 16F877A
Declare Xtal=4
Config FOSC_XT, WDTE_OFF, PWRTE_ON, BOREN_ON, LVP_OFF, CPD_OFF, WRT_OFF, DEBUG_OFF, CP_OFF

TRISA=%000000:TRISB=%00000000:TRISC=%00000000:TRISD=%00000011:TRISE=%000
PORTA=%000000:PORTB=%00000000:PORTC=%00000000:PORTD=%00000000:PORTE=%000
CMCON =7
Declare All_Digital= true

Symbol GERI=PORTD.0
Symbol ILERI=PORTD.1
Dim SAY As Byte
Clear

LOOP:
If SAY<1 Then SAY=1
If SAY>14 Then SAY=14

If ILERI=0 Then SAY=SAY+1:DelayMS 500
If GERI=0 Then SAY=SAY-1:DelayMS 500

If SAY=1 Then PORTA.0=1:Else:PORTA.0=0
If SAY=2 Then PORTA.1=1:Else:PORTA.1=0
If SAY=3 Then PORTA.2=1:Else:PORTA.2=0
If SAY=4 Then PORTA.3=1:Else:PORTA.3=0
If SAY=5 Then PORTE.0=1:Else:PORTE.0=0
If SAY=6 Then PORTA.5=1:Else:PORTA.5=0

If SAY=7 Then PORTB.0=1:Else:PORTB.0=0
If SAY=8 Then PORTB.1=1:Else:PORTB.1=0
If SAY=9 Then PORTB.2=1:Else:PORTB.2=0
If SAY=10 Then PORTB.3=1:Else:PORTB.3=0
If SAY=11 Then PORTB.4=1:Else:PORTB.4=0
If SAY=12 Then PORTB.5=1:Else:PORTB.5=0
If SAY=13 Then PORTB.6=1:Else:PORTB.6=0
If SAY=14 Then PORTB.7=1:Else:PORTB.7=0

GoTo LOOP




:10000000000000308A00312883178001840AFF3EF7
:10001000031D05282D28A301A200FF30A207031C01
:10002000A307031C2D280330A100DF3019200D2861
:10003000A101E83EA000A109FC30031C2228A00772
:1000400003181F28A0070000A10F1F282018282828
:10005000A01C2C2800002C280800831383120313F3
:10006000080083018316850186018701033088001B
:100070008901831285018601870188018901073082
:1000800083169C009F009C00203084006030831207
:100090008A010520A030840050308A0105201030EC
:1000A000840060308A0104209030840060308A012E
:1000B0000420013024028A110A1203186128013039
:1000C000A4000F3024028A110A12031C69280E3082
:1000D000A4008A110A1288187328A40A0130A30008
:1000E000F4308A010C208A110A1208187D28A40312
:1000F0000130A300F4308A010C20013024028A115F
:100100000A12031D872805148A110A12882805106F
:10011000023024028A110A12031D922885148A11C2
:100120000A1293288510033024028A110A12031D33
:100130009D2805158A110A129E28051104302402F3
:100140008A110A12031DA82885158A110A12A928E6
:100150008511053024028A110A12031DB3280914DF
:100160008A110A12B4280910063024028A110A12D0
:10017000031DBE2885168A110A12BF288512073072
:1001800024028A110A12031DC92806148A110A12B0
:10019000CA280610083024028A110A12031DD42826
:1001A00086148A110A12D5288610093024028A1171
:1001B0000A12031DDF2806158A110A12E02806110B
:1001C0000A3024028A110A12031DEA2886158A11B0
:1001D0000A12EB2886110B3024028A110A12031D21
:1001E000F52806168A110A12F62806120C30240287
:1001F0008A110A12031D002986168A110A12012982
:1002000086120D3024028A110A12031D0B290617CB
:100210008A110A120C2906130E3024028A110A12BE
:10022000031D162986178A110A12172986138A01B7
:0602300059288A0119297A
:02400E00713F00
:00000001FF


sonmoikan

#2
Pic Basic için şu şekilde kısa bir kodda kullanabilirsin:


@ DEVICE PIC16f877A
@ DEVICE PIC16f877A, WDT_OFF
@ DEVICE PIC16f877A, BOD_ON
@ DEVICE PIC16f877A, PWRT_ON
@ DEVICE PIC16f877A, PROTECT_OFF
@ DEVICE PIC16f877A, XT_OSC

DEFINE OSC 4

ADCON1=7
OPTION_REG.7=0
TRISA=0 : TRISB=0 : TRISC=0
TRISD=%00000011
TRISE=0 : PORTA=0 : PORTB=0
PORTC=0 : PORTD=0 : PORTE=0

SAYI VAR WORD
SAYI = 1

BASLA:

    IF SAYI=0 THEN SAYI=1
    IF SAYI=32768 THEN SAYI=16384
   
    IF PORTD.1 = 0 THEN SAYI=SAYI*2
    WHILE PORTD.1=0 : WEND
   
    IF PORTD.0 = 0 THEN SAYI=SAYI/2
    WHILE PORTD.0=0 : WEND
   
    PORTB=SAYI.LOWBYTE
    PORTC=SAYI.HIGHBYTE

GOTO BASLA


Alttaki Linkte tüm dosyalar mevcuttur.
ABDULLAH

ete

#3
Bu devrede PORTB ye butonlar dahili pullup lar kullanılarak bağlanmalı, çıkışlarda C ve D portuna bağlanmalıdır.
Bu şekilde hem devre son derece sade hemde program bir kaç satıra hallolabilir.

Her zaman söylerim. PORTB daima girişlere ayrılmalıdır. Ne türlü giriş olursa olsun. Gerekirse avantajlarını kullanırsın gerekirse kullanmazsın ama PORTB daima girişler ve özellikle de butonlar için kullanılmalıdır.

Bu projede toplam 14 yerine toplam 16 adet çıkış kullanılabilir. Dolayısıyla PORTC ve PORTD bu iş için kullanılabilir.
Word tipinde bir RAKAM değişkeni kullanılır. Bunun Byte0 kısmı PORTC de Bye1 kısmıda PORTD ye direk verilir.
Artır (İleri butonuna basıldığında);
RAKAM=RAKAM<<1
yapılır. bütün pinler aktif olduktan sonra artırmaya devam edince hepsi otomatikman söner çünki başa dönülür.
BU nedenle artır butonuna basıldığı zaman şu komutu eklemekte yarar var.
IF RAKAM=0 THEN RAKAM=1
Eksiltem (geri) de bu işin tersini yapar.
Sonra PORTC=RAKAM.Byte0 ve PORTD=RAKAM.Byte1 denildimi seçilen rakam değerine bağlı olarak çıkışlar aktif edilmiş olur.
Ancak bu sistem bir komutatör gibi kullanılacak ise her seferinde bir çıkış aktif olmalıdır. O zamanda,
Tuşa basıldığında RAKAM=RAKAM+1 yapılır. Ardından rakam 8 den büyük ise D portunda çıkış verilmeli değilse C portunda verilmeli. Bu amaçla kod şöyle yazılabilir;

IF RAKAM<9 then 
   PORTC=DCD(Rakam-1)
Else
   D=RAKAM//8
   PORTD=DCD(D-1)
ENDIF

Ete

mali4242

Maxim arkadaşım öncelikle teşekkür ederim. isis ile simüle ettim fakat (RA4) portu yani 5. led çalışmıyor. simülasyonla ilgili bir hata mı bilmiyorum.

sonmoikan arkadaşın göderdiği kodlar ile sorunsuz çalıştırdım. kısa zaman içinde devreyi kurup çalıştırırım.

ikinize de ayrı ayrı teşekkür ederim, sağolun. :)

Maxim

Alıntı yapılan: mali4242 - 28 Nisan 2016, 13:35:39
Maxim arkadaşım öncelikle teşekkür ederim. isis ile simüle ettim fakat (RA4) portu yani 5. led çalışmıyor. simülasyonla ilgili bir hata mı bilmiyorum.

sonmoikan arkadaşın göderdiği kodlar ile sorunsuz çalıştırdım. kısa zaman içinde devreyi kurup çalıştırırım.

ikinize de ayrı ayrı teşekkür ederim, sağolun. :)

yukardaki mesajımda anlatmıştım nedenini.

mali4242

Alıntı yapılan: Maxim - 28 Nisan 2016, 14:53:24
yukardaki mesajımda anlatmıştım nedenini.

pardon yanlış anlamışım.

Powered by EzPortal