Merhabalar arkadaşlar. Pic 16f877a ile 8 adet röleyi aç kapa şeklinde kontrol ediyorum.8 adet butondan hangisine basarsam o röle açılıp kapanıyor.1 inci butona bastıgımda 1 röle kontak değiştiriyor 2 inci butona basasrsam 2 inci kontak değiştiriyor seklinde.ben aynı anda iki kontagında aktif olmasını istemiyorum. Uçlarında lamba bağlı sayarsak 1 butona bastım 1 lamba yandı.2 butona bastıgımda 2 yanıcak. ama 1 in sönmesini isityorum.yazılımda ufak bi değişiklik işi görücektir diye düşünüyrm. şimdiden teşekkür ederim. devrenin isis şeması yazılımı içindedir.protonla yazılmıştır. proton dilini bilmedigim için yazılımda ne tür bir değişiklik yapmam gerekir.?
[IMG]http://img225.imageshack.us/img225/4430/adszhii.jpg[/img] (http://imageshack.us/photo/my-images/225/adszhii.jpg/)
Uploaded with ImageShack.us (http://imageshack.us)
https://rapidshare.com/files/2346234057/Desktop.rar (https://rapidshare.com/files/2346234057/Desktop.rar)
mesaj birleştirme:: 04 Eylül 2012, 14:45:06
;----------------------yazılım şu şekildedir hangi satırda değişiklik yapmalıyım------------------------------------
NOLIST
#include "E:\MASAüSTü\ELEKTRONİK DEVRELER\8LED8ROLE\8LED8ROLE.PBP"
LIST
F2_SOF equ $ ; 8LED8ROLE.PRP
F2_EOF equ $ ; 8LED8ROLE.PRP
F1_SOF equ $ ; 8LED8ROLE.BAS
F1_000012 equ $ ; in [8LED8ROLE.BAS] PORTD=0
Clrf PORTD
F1_000013 equ $ ; in [8LED8ROLE.BAS] TRISB=255
Bsf STATUS,5
ram_bank = 1
Movlw 255
Movwf TRISB
F1_000014 equ $ ; in [8LED8ROLE.BAS] TRISD=0
Clrf TRISD
F1_000015 equ $ ; in [8LED8ROLE.BAS] PORTD=0
Bcf STATUS,5
ram_bank = 0
Clrf PORTD
BASLA
F1_000018 equ $ ; in [8LED8ROLE.BAS] WHILE PORTB=0
bc@LL1
Movf PORTB,F
set@page bc@LL2
Btfss STATUS,2
Goto bc@LL2
F1_000019 equ $ ; in [8LED8ROLE.BAS] WEND
F@Jump bc@LL1
bc@LL2
F1_000020 equ $ ; in [8LED8ROLE.BAS] IF PORTB.0=1 THEN TOGGLE PORTD.0
set@page bc@LL4
Btfss PORTB,0
Goto bc@LL4
Movlw 1
Xorwf PORTD,F
Bsf STATUS,5
ram_bank = 1
Bcf TRISD,0
bc@LL4
Bcf STATUS,5
ram_bank = 0
F1_000021 equ $ ; in [8LED8ROLE.BAS] IF PORTB.1=1 THEN TOGGLE PORTD.1
set@page bc@LL6
Btfss PORTB,1
Goto bc@LL6
Movlw 2
Xorwf PORTD,F
Bsf STATUS,5
ram_bank = 1
Bcf TRISD,1
bc@LL6
Bcf STATUS,5
ram_bank = 0
F1_000022 equ $ ; in [8LED8ROLE.BAS] IF PORTB.2=1 THEN TOGGLE PORTD.2
set@page bc@LL8
Btfss PORTB,2
Goto bc@LL8
Movlw 4
Xorwf PORTD,F
Bsf STATUS,5
ram_bank = 1
Bcf TRISD,2
bc@LL8
Bcf STATUS,5
ram_bank = 0
F1_000023 equ $ ; in [8LED8ROLE.BAS] IF PORTB.3=1 THEN TOGGLE PORTD.3
set@page bc@LL10
Btfss PORTB,3
Goto bc@LL10
Movlw 8
Xorwf PORTD,F
Bsf STATUS,5
ram_bank = 1
Bcf TRISD,3
bc@LL10
Bcf STATUS,5
ram_bank = 0
F1_000024 equ $ ; in [8LED8ROLE.BAS] IF PORTB.4=1 THEN TOGGLE PORTD.4
set@page bc@LL12
Btfss PORTB,4
Goto bc@LL12
Movlw 16
Xorwf PORTD,F
Bsf STATUS,5
ram_bank = 1
Bcf TRISD,4
bc@LL12
Bcf STATUS,5
ram_bank = 0
F1_000025 equ $ ; in [8LED8ROLE.BAS] IF PORTB.5=1 THEN TOGGLE PORTD.5
set@page bc@LL14
Btfss PORTB,5
Goto bc@LL14
Movlw 32
Xorwf PORTD,F
Bsf STATUS,5
ram_bank = 1
Bcf TRISD,5
bc@LL14
Bcf STATUS,5
ram_bank = 0
F1_000026 equ $ ; in [8LED8ROLE.BAS] IF PORTB.6=1 THEN TOGGLE PORTD.6
set@page bc@LL16
Btfss PORTB,6
Goto bc@LL16
Movlw 64
Xorwf PORTD,F
Bsf STATUS,5
ram_bank = 1
Bcf TRISD,6
bc@LL16
Bcf STATUS,5
ram_bank = 0
F1_000027 equ $ ; in [8LED8ROLE.BAS] IF PORTB.7=1 THEN TOGGLE PORTD.7
set@page bc@LL18
Btfss PORTB,7
Goto bc@LL18
Movlw 128
Xorwf PORTD,F
Bsf STATUS,5
ram_bank = 1
Bcf TRISD,7
bc@LL18
Bcf STATUS,5
ram_bank = 0
F1_000028 equ $ ; in [8LED8ROLE.BAS] DELAYMS 300
Movlw 1
Movwf PP1H
Movlw 44
F@Call dly@w
F1_000029 equ $ ; in [8LED8ROLE.BAS] GOTO BASLA
F@Jump BASLA
F1_EOF equ $ ; 8LED8ROLE.BAS
LIST
END
bu değil
sonu BAS ile biten dosya kod tur.
onu veriniz
ASM KODLARI
8BUTON 8 ROLE KONTROL ASM. KODLARI
LIST P=16F877A
INCLUDE "P16F877.INC"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAPI AYARLARI;;;;;;;;;;;;;;;;
BSF STATUS,5 ; BANK1 GEÇİŞ YAPILDI
MOVLW H'FF'
MOVWF TRISB ; B KAPISI GİRİŞ SEÇİLDİ
MOVLW H'00'
MOVWF TRISD ; D KAPISI ÇIKIŞ SEÇİLDİ
BCF OPTION_REG,7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ANA PROGRAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCF STATUS,5 ;bank sıfıra geçiş yapıldı
CLRF PORTD ;PORTD İÇİNİ TEMİZLE
B1
BTFSS PORTB,0 ;
GOTO B2 ; B2 YE GİT
BSF PORTD,0 ;
BTFSS PORTB,0 ;
GOTO B2 ;
BCF PORTD,0 ;
CALL B2 ;
B2
BTFSS PORTB,1
GOTO B3
BSF PORTD,1
BTFSS PORTB,1
GOTO B3
BCF PORTD,1
CALL B3
B3
BTFSS PORTB,2
GOTO B4
BSF PORTD,2
BTFSS PORTB,2
GOTO B4
BCF PORTD,2
CALL B4
B4
BTFSS PORTB,3
GOTO B5
BSF PORTD,3
BTFSS PORTB,3
GOTO B5
BCF PORTD,3
CALL B5
B5
BTFSS PORTB,4
GOTO B6
BSF PORTD,4
BTFSS PORTB,4
GOTO B6
BCF PORTD,4
CALL B6
B6
BTFSS PORTB,5
GOTO B7
BSF PORTD,5
BTFSS PORTB,5
GOTO B7
BCF PORTD,5
CALL B7
B7
BTFSS PORTB,6
GOTO B8
BSF PORTD,6
BTFSS PORTB,6
GOTO B8
BCF PORTD,6
CALL B8
B8
BTFSS PORTB,7
GOTO B9
BSF PORTD,7
BTFSS PORTB,7
GOTO B9
BCF PORTD,7
CALL B9
B9
GOTO B1
END
Tuş kontrol fonksiyonu içine(interrupt da olabilir)
girdiğinde basılan tuşun rölesini çalıştır, arkasından diğer
röleleri kapat.
Her if satırından sonra kaç röle kapatacaksan o kadar
PORTD.x = 0
yazman gerekli...
Ama if öncesi port temizlemesi yaparsan
bastığın röle çekili iken bırakıp yeniden çeker.
Tabi bu önemli değil dersen bunu yapmak daha kolay.
Bu zaman da;
ilk if öncesi röle portunu temizleyip
sonra buton okuması yaparsın.
Bu arada butonlardaki debounce
olayını atlama...
Kolay gelsin....
bas dosyasını verin diyorum asm kodunu veriyorsunuz
benmi anlatamıyorum anlamadım ?
BAS dosyası
husamettin.bas
ahmet.bas
anlatabiliyormuyum.bas
mesaj birleştirme:: 04 Eylül 2012, 16:19:49
evet arkadaşın verdiği bilgiye göre
bu programı aldığı yerde kaynak kodu yok
yani bu devreyi paylaşan adam, asıl kod olan bas dosyasını yayınlamamış
dolayısı ile programın baştan yazılması gerekiyor
bu hali ile üzerinde değişiklik yapılamaz
Protonu boşver aşağıdaki programı mplab ile derle. Çalışır.
LIST P=16F877A
INCLUDE "P16F877.INC"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAPI AYARLARI;;;;;;;;;;;;;;;;
BSF STATUS,5 ; BANK1 GEÇİŞ YAPILDI
MOVLW H'FF'
MOVWF TRISB ; B KAPISI GİRİŞ SEÇİLDİ
MOVLW H'00'
MOVWF TRISD ; D KAPISI ÇIKIŞ SEÇİLDİ
BCF OPTION_REG,7
BCF STATUS,5 ;bank sıfıra geçiş yapıldı
CLRF PORTD ;PORTD İÇİNİ TEMİZLE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ANA PROGRAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0X00
BASLA
BTFSS PORTB,0
GOTO BAK1
CLRF PORTD
BSF PORTD,0
BAK1
BTFSS PORTB,1
GOTO BAK2
CLRF PORTD
BSF PORTD,1
BAK2
BTFSS PORTB,2
GOTO BAK3
CLRF PORTD
BSF PORTD,2
BAK3
BTFSS PORTB,3
GOTO BAK4
CLRF PORTD
BSF PORTD,3
BAK4
BTFSS PORTB,4
GOTO BAK5
CLRF PORTD
BSF PORTD,4
BAK5
BTFSS PORTB,5
GOTO BAK6
CLRF PORTD
BSF PORTD,5
BAK6
BTFSS PORTB,6
GOTO BAK7
CLRF PORTD
BSF PORTD,6
BAK7
BTFSS PORTB,7
GOTO BASLA
CLRF PORTD
BSF PORTD,7
GOTO BASLA
END
Programı deneme şansım olmadı. Acele ile şimdi yazdım. Olumlu veya olumsuz her sonucu yazarsan sevinirim.
Maxim, arkadaş sanırım biraz acemi. Elinden geldiğince derdini anlatmaya çalışmış. Hoş görmek lazım.
İyi çalışmalar.
Kopyala/Yapıştır ile bu işler olmaz, biraz öğrenmeniz lazım
öncelikle.
Maxim; Arkadaş protonla yazılmış bir program bulmuş,
basic dosyası yok. program asm çevrilmiş ve
http://elektrobilim.org/forum/pic-uygulamalari/5598-pic-16f877a-ile-8-buton-8-role-kontrol-devresi.html (http://elektrobilim.org/forum/pic-uygulamalari/5598-pic-16f877a-ile-8-buton-8-role-kontrol-devresi.html)
buradan alınmış.
Ezberden uzak durmak lazım.
Saygılar...
Not: Önceki cevabımdaki olayı tekrarlıyorum;
Eğer döngü içinde portun 0 dan farklı olduğu
tespit edilir ve port temizlenirse önceden çekilmiş
olan röle bırakır. Bunu engellemek gerekir.
Öncelikle hepinize yardımlarınız için teşekkür ederim. yazılım konusunda acemi oldugum dogrudur. mehmet kardeşim ezbere konmak bende istemiyorum zamanım çok kısıtlı ve yazdıklarını araştırıcam . Ama bir yerlerden bi şekilde başlamayınca ögrenilmiyor.o yüzden böyle bir devre ile başladım. logan kardeş çok teşekkür ederim . en kısa zamanda derleyip satır satır ne işe yaradıgını anlayıp sonucu bildiricem. Eksik hata ne varsa beraber çözelim isterimki herkez yararlansın bilgi paylaşılsın.
mesaj birleştirme:: 05 Eylül 2012, 11:51:34
mplab kurdum.logan arkadasımızın programını derledigimde bir kaç hata ile karşılaştım. [IMG]http://img528.imageshack.us/img528/3774/asdsadasb.jpg[/img] (http://imageshack.us/photo/my-images/528/asdsadasb.jpg/)
Uploaded with ImageShack.us (http://imageshack.us)
anladıgım kadarı ile 'status' 'trisb' 'trisd' ''portd' 'portb' nin tanıtılması gerekli.
Bir yerden başlanması gerekiyorsa
bence en uygun işlemci(Pic serisi için)
16F628(a) olmalı, önce mcu yu tanımalısın.
Girişleri çıkışları nasıldır, hangi pinler ne işe
yarar öncelikle bunlarla ilgilenmelisin.
Sonra led yakma uygulamaları ve daha
sonra buton uygulamaları olmalı. Daha
sonra öğrenilmesi gereken şeylere bir anda
ulaşmak çabuk bıkmana sebep olur.
Saygılar...
Programlama dili olarak hangi dili seçmeliyim ? Evet haklısınız ilk başta bunlar ile başlamam gerektigine karar verdim. bu mantıkta devreyi acil olarak yapmam gerektigi için sizlere danışıyorum zaten iş yerinde kullanıcam.elektronik olarak azda olsa bilgim var.pic ile yapamazsam 4017 kullanmayı düşünüyorum. teyp standında kullanıcam. tek buton ile sıra sıra geçiş saglamak yerine pic ile hangi butona bassarsam o röle aktif olsun istiyorum
Evet o kısmı atlamışız. O registerleri programın başında tanımlamak gerekli. Fakat 16f877'nin include dosyasını bulamaması ilginç. Programda INCLUDE "P16F877.INC" satırının altına ;
STATUS EQU 0X03
OPTION_REG EQU 0X81
PORTB EQU 0X06
PORTD EQU 0X08
TRISB EQU 0X86
TRISD EQU 0X88
yazman gerekli.
Error [223] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 1. digit out of range
Error [876] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 1. syntax error
Error [140] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 2. can't open include file "P16F877.INC": No such file or directory
Error [876] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 12. syntax error
Error [876] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 14. syntax error
Error [810] ; 0. unknown op "include" in emasm()
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 27. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 28. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 30. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 31. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 32. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 33. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 35. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 36. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 37. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 38. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 40. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 41. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 42. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 43. phase error
Error [840] C:\Users\ultima's\Desktop\DENEM\altugduranoglu.asm; 45. phase error
Advisory[1] too many errors (21)
evet o hatalarda kalktı. yinede 21 adet hata buluyor.
Bu arada başlangıç olarak ögrenmeye ccs c ile başlayacagım. serdar çiçek ccs c kitabını şipariş ettim :)
Programın başındaki INCLUDE "P16F877.INC" satırını INCLUDE "PIC16F877.INC" olarak değiştirmeyi dener misin? Include dosyasını görmüyor. Bütün hata bu sanırım.
aynı hatayı veriyor nerde sıkıntı var acaba ?
Alıntı yapılan: mehmet - 04 Eylül 2012, 18:41:34
http://elektrobilim.org/forum/pic-uygulamalari/5598-pic-16f877a-ile-8-buton-8-role-kontrol-devresi.html (http://elektrobilim.org/forum/pic-uygulamalari/5598-pic-16f877a-ile-8-buton-8-role-kontrol-devresi.html)
buradan alınmış.
Saygılar...
Merhaba
Mehmet beyin verdiği linkte ben bu çalışmanın bazı kısımlarını değiştirdim ve de çalışır hale getirmiştim.Linkteki çalışmaları tekrar bir gözden geçirir misiniz?
Evet verdiginiz linki inceledim. animasyonlu röle eklemişsiniz. oysaki benim tek derdim var oda şu aynı anda iki rölenin aktif olmasını istemiyorum. açıkcası ben röle çıkışlarını 8 adet standaki teybe bağlayacağım burdan tek anfi ile besleyecegim. şimdi şahıs iki röleyide aktif hale getirirse amfi yanmış olacaktır. hangi butona basarsam o aktif olucak diger en son bastıgım eski haline dönücek şeklinde.
mesaj birleştirme:: 05 Eylül 2012, 22:05:33
bu arada 4017 ve 555 ile basit bir devre kurdum tek buton ile tek tek sıra ile 10 röle anahtarlama yapabiliyorum.ama istedigim tam olarak bu değil. İnat ettim ne olursa olsun pic'le bu işi yapıcam.ne demişler azimle mıçan taşı delermiş :)
Merhaba
Zaman bulursam ve de acele etmezseniz size programı da yazabilirim.Hatta daha kullanışlı olması ve de reset atmaması için optokaplır da ilave ederek daha kullanışlı bir devre dizayn edelim.
Merhaba
Evet çok güzel olur.beraber çözelim.yardımlarınızı bekliyrm. bende bu arada picle ufaktan uygulamara göz atıcam.yazılım olayını çözmem gerek.
hala bekliyorum yardımlarınızı
hangi butona basılırsa o çıkış aktif olarak kalacakmı ? yoksa çekip bırakacakmı?
buton 1 = çıkış 1 (sürekli)
birde aynı anda 2 butona basma durumu için kontrol yapılacakmı ?
ne olursa olsun tek çıkışmı aktif olacak?
mesaj birleştirme:: 24 Ekim 2012, 09:49:34
bu hex dosyasını bir deneyin
16F877A 4mhz osc
buton girişleri PORTB (pull-up direnç takmayın çünkü portb de zaten var)
çıkışlar portD
:10000000000000308A002A28A301A200FF30A207C6
:10001000031CA307031C26280330A100DF30122095
:100020000628A101E83EA000A109FC30031C1B2802
:10003000A00703181828A0070000A10F18282018EF
:100040002128A01C252800002528080083138312DE
:10005000031308008301880183168501FF308600A1
:100060008701880107309C009F009C008113831248
:100070008A110A120618402826148A110A124228E8
:10008000261026108A110A1286184A28A6148A11E8
:100090000A124C28A610A6108A110A120619542812
:1000A00026158A110A125628261126118A110A12BB
:1000B00086195E28A6158A110A126028A611A611B3
:1000C0008A110A12061A682826168A110A126A2844
:1000D000261226128A110A12861A7228A6168A1168
:1000E0000A127428A612A6128A110A12061B7C286C
:1000F00026178A110A127E28261326138A110A123D
:10010000861B8628A6178A110A128828A613A6130A
:10011000003026180130A400A5010301A618013003
:10012000A4070318A50A030126190130A407031820
:10013000A50A0301A6190130A4070318A50A0301A3
:10014000261A0130A4070318A50A0301A61A0130D4
:10015000A4070318A50A0301261B0130A4070318EE
:10016000A50A2408A61B013EA700A7088A110A12A7
:100170000319C028013027028A110A12031DF02832
:100180008A110A120618C628013088008A110A123C
:100190008618CC28023088008A110A120619D22843
:1001A000043088008A110A128619D828083088007D
:1001B0008A110A12061ADE28103088008A110A12E3
:1001C000861AE428203088008A110A12061BEA28C1
:1001D000403088008A110A12861BF028803088007F
:0E01E00001308A0104208A0137288A01F5289F
:02400E00313F40
:00000001FF
toggle komutu işine yarar sanırım. butona basıp bıraktığında çıkış olarak ayarladığın pinin durumunu değiştir.
çekip bırakma yapmayacak sürekli olacak. 2 anahtar aynı anda çalışmayacak.
https://rapidshare.com/files/510028129/yeni.rar
dediğiniz gibi bir programı protonda yazdım. Programı anlamaya çalışıp değişiklik yapılması gereken yerleri değiştirebilirsiniz. Takıldığınız yer olursa sorabilirsiniz. (devredeki tuşların önündeki pull down dirençlerini kaldırıp yazılımda değişiklik yaparak da çalıştırabilirsiniz
Kolay gelsin...
bende merak ettim inceledim eeprom olayı olmadığından son kaldığı yer bilinemiyor bundan vazgelim ilk voltaj verildiğinde tüm çıkışlar pasif bu durumda hep elle müdahele gerekir .....
portc ler giriş olacak. yani buton
portd ler ise röle çıkışı olacak
aşağıdaki gibi yaparsan işini görecektir.
basla:
if portc.0=1 then
gosub 1. role
end if
if portc.1=1 then
gosub 2. role
end if
if portc.2=1 then
gosub 3. role
end if
goto basla
1.role:
portd.0=1
if portc.0=1 then
goto 1. role
else
portd.0=0
end if
return
2.role:
portd.1=1
if portc.1=1 then
goto 2. role
else
portd.1=1
end if
return
3.role:
portd.2=1
if portc.2=1 then
goto 3. role
else
portd.2=0
end if
return
arkadaşlar çok teşekkür ederim ederim. elektroakif kardeş tam istedigim gibi olmuş. Uygulamaya hemen koyucam fotoları koyarım en kısa zamanda:) ccs c de bunu yazmayı deneyeceğim.saygılar.