Tek Butonla Gecikmeli on-off

Başlatan POWER, 27 Temmuz 2004, 17:44:07

POWER

Değerli arkadaşlar;

Bu yazılımla Tek butonla bir roleyi kapatıp açıyorum.Fakat benim istediğim 2 saniye gecikme ile rolenin kapanması veya açılması.Bunun için neler eklenmesi lazım yardımcı olabilirmisiniz. :( (Bu yazılımı netten aldım benim becerim değil)

   PROCESSOR 16F84

   INCLUDE P16F84.INC

   RADIX DEC


   __IDLOCS H'0100'

   __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

; Diverses

ZERO   EQU Z   ; ZERO-Flag
CARRY    EQU C   ; CARRY-Flag


; Variable

SR1   = 12   ; located in Bank 0, 1
SR1_FD   = 13   ; located in Bank 0, 1
S0   = 14   ; located in Bank 0, 1
MF1   = 15   ; located in Bank 0, 1
MF1_HI   = 16   ; located in Bank 0, 1
SYS_WSAV   = 17   ; located in Bank 0, 1
SYS_SSAV   = 18   ; located in Bank 0, 1
MF1_FD   = 19   ; located in Bank 0, 1
RAM   = 20   ; located in Bank 0, 1

   ERRORLEVEL -302   ; disable warning (Bankswitching)
   ERRORLEVEL -306   ; disable warning (Pageswitching)

;****************************************
;Programmanfang
;****************************************

   ORG 0

   CLRF STATUS   ; switch to RAM-Bank 0
   GOTO SYS_INIT
   NOP
   NOP

;****************************************
;Interrupt-Adress
;****************************************

   MOVWF SYS_WSAV   ; save register
   SWAPF STATUS,W
   CLRF STATUS   ; bank 0
   MOVWF SYS_SSAV

   BCF INTCON,T0IF   ; Interrupt quitieren

   INCFSZ MF1,F
   GOTO SYS_INT_LABEL_0
   INCF MF1_HI,F

SYS_INT_LABEL_0

EXITINT

   SWAPF SYS_SSAV,W   ; Register zurück
   MOVWF STATUS
   SWAPF SYS_WSAV,F
   SWAPF SYS_WSAV,W

   RETFIE   ; RETurn From Interrupt and Enable GIE


;****************************************
; Subroutines
;****************************************


;****************************************
;Initialisierung
;****************************************


SYS_INIT

   MOVLW B'00100000'
   MOVWF INTCON

; Ausgangs-Pegel setzen, bevor die Richtung gesetzt wird

   BCF STATUS,RP0   ; Bank 0
   MOVLW B'00000000'
   MOVWF PORTA

   MOVLW B'00000000'
   MOVWF PORTB

   MOVLW 15
   BSF STATUS,RP0   ; Bank 1
   MOVWF OPTION_REG


; Richtung setzen

   MOVLW B'11111111'
   MOVWF TRISA

   MOVLW B'11111110'
   MOVWF TRISB

; init vars


; Clear RAM

   MOVLW 12
   MOVWF FSR
CR1
   CLRF INDF
   INCF FSR,F
   MOVFW FSR
   SUBLW 80
   BTFSS STATUS,ZERO
   GOTO CR1


   BCF STATUS,RP0   ; Bank 0
   CLRF TMR0
   BCF INTCON,T0IF
   BSF INTCON,GIE   ; Interrupt freigeben

;**********************************
;******* Haupt-Programm ***********
;**********************************

MAIN

;***************************************************
; Schieberegister -> SR1
;***************************************************

   BTFSS S0,0   ; Reset ?
   GOTO LABEL_SR1_SHIFT
   CLRF SR1
   GOTO LABEL_SR1_SETOUT

LABEL_SR1_SHIFT

; Test auf positive Flanke

   BTFSC SR1_FD,0
   GOTO LABEL_SR1_SETFD
   BTFSS S0,1
   GOTO LABEL_SR1_SETFD
   BCF STATUS,CARRY
   BTFSC S0,1
   BSF STATUS,CARRY

   RLF SR1,F

LABEL_SR1_SETOUT

; Output Q0

   BTFSS SR1,0
   GOTO LABEL_SR1_SETOUT0
   BCF STATUS,RP0   ; Bank 0
   BSF PORTB,0
   GOTO LABEL_SR1_SETOUT0_END
LABEL_SR1_SETOUT0
   BCF STATUS,RP0   ; Bank 0
   BCF PORTB,0
LABEL_SR1_SETOUT0_END

; Output Q1

   BTFSS SR1,1
   GOTO LABEL_SR1_SETOUT1
   BSF S0,0
   GOTO LABEL_SR1_SETOUT1_END
LABEL_SR1_SETOUT1
   BCF S0,0
LABEL_SR1_SETOUT1_END

LABEL_SR1_SETFD

   BTFSS S0,1
   GOTO LABEL_SR1_SETFD2
   BSF SR1_FD,0
   GOTO LABEL_SR1_END
LABEL_SR1_SETFD2
   BCF SR1_FD,0
LABEL_SR1_END

;***************************************************
; Mono-Flop -> MF1
;***************************************************

; Läuft der Impuls ?

   BTFSC MF1_FD,1
   GOTO LABEL_MF1_CHKTIME

; Test auf positive Flanke

   BTFSC MF1_FD,0
   GOTO LABEL_MF1_SETFD
   BCF STATUS,RP0   ; Bank 0
   BTFSS PORTA,0
   GOTO LABEL_MF1_SETFD


LABEL_MF1_RESET

   CLRF MF1
   CLRF MF1_HI
   BSF MF1_FD,1
   BSF S0,1

LABEL_MF1_CHKTIME

   MOVLW 0
   SUBWF MF1_HI,W
   BTFSS STATUS,ZERO
   GOTO LABEL_MF1_CHECK
   MOVLW 78
   SUBWF MF1,W
LABEL_MF1_CHECK
   BTFSS STATUS,CARRY
   GOTO LABEL_MF1_SETFD
LABEL_MF1_TO

   BCF MF1_FD,1
   BCF S0,1

LABEL_MF1_SETFD

   BCF STATUS,RP0   ; Bank 0
   BTFSS PORTA,0
   GOTO LABEL_MF1_CLR
   BSF MF1_FD,0
   GOTO LABEL_MF1_ENDE
LABEL_MF1_CLR
   BCF MF1_FD,0

LABEL_MF1_ENDE

;****************************************

   GOTO MAIN


   END
TB6BKG

ete

Arkadaşım,

İstediğin programı PicBasicPro da yazıp Isis de simule ettim. Tüm dosyaları aşağıdaki adrese upload ettim. Alabilirsin. Programda gerekli açıklamalar var.
Kolay Gelsin
ETE

http://groups.yahoo.com/group/PicProjeUP4/files/ETE-Files/
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

fsan


DumrulBey

Merhaba,

Fikret, ben PIC Basic fazla bilmem ama kodların HEX boyutlarını merak ettim ve derledim. Parantezler nedeniyle derleme hatası aldım. Peki ya sen nasıl derledin? Ben derlemeyi Proton+ 2.1.3 ile yaptım. Sonra parantezleri kaldırınca sorunu aştım.

Ayrıca Erol'dan farklı olarak ne yaptığını anladım, yani kodu toparlamaya çalışmışsın. Ancak bu sefer zamanlama kısmı hatalı olmuş. Eğer gecikme bitene kadar basarsan LED yanıyor. Sanırım arkadaşımız böyle bir özellik istemedi. Yoksa ben mi yanlış anladım?

Bu arada şunu ASM'de yazayım dedim. Geçmişte böyle bir şey istenmişti ve yine forumda tartışmıştık. Başlığı hatırlamıyorum ama dosya tarihi 15 Şubat 2004 gözüküyor. Arkadaşımızın isteğine göre bir zamanlama koydum. Hızlı bir uygulama olmdığı için RC osilatör kullandım. Kodun bir kısmı aşağıda:

BASLA	; ANA DÖNGÜ
YAN:
       BTFSC	PORTB, 0	; Düğmeye basıldı mı?
       GOTO	YAN		; Hayırsa üst satırdan devam et...
       CALL	BEKLE	; Bir süre bekle,
       BSF	PORTB, 7	; Evetse PORTB'deki LED'i aç.
       CALL	DEVAM	; Düğme bırakıldıysa devam et...
SON
       BTFSC	PORTB, 0	; Düğmeye bırakıldıktan sonra basıldı mı?
       GOTO	SON		; Hayırsa üst satırdan devam et...
       CALL	BEKLE	; Bir süre bekle,
       BCF	PORTB, 7	; Evetse PORTB'deki LED'i kapa
       CALL	DEVAM
GOTO	BASLA

; ALT PROGRAMLAR
DEVAM
       BTFSS	PORTB, 0	; Düğme bırakıldı mı?
       GOTO	DEVAM	; Hayırsa üst satırdan devam et...
       RETURN		; Evetse geri dön ve devam...

:arrow: Devamı: http://groups.yahoo.com/group/PicProjeUP3/files/DumrulBey
(20 KB. - Benzetimli şema ile üç farklı şekilde ASM, BAS ve HEX dosyaları)

Sözümün başında dediğim gibi boyutları merak ettim ve her zaman ki gibi ASM (211 bayt) ile yapılan çok az yer tuttu. Fakat bir şey dikkatimi çekti! Fikret'in yaptığı (730 bayt), Erol'un yaptığından (513 bayt) daha büyüktü. Acaba gecikme ile ilgili değişiklik nedeniyle bu kadar büyüdü. Yoksa şartlı satırları birleştirmek kodu büyütüyor olabilir mi?

Şimdi araştırıyorum bu vesileyle PIC Basic'e de adım atıyorum. Üstesinden gelinemeyecek bir dil değil ama hala ısınamadım. Acaba C kodu ile yapılanlar daha iyimi olur diye hep düşünüyorum. Araştırmalarım devam edecek. Sizde katılıp düşünceleriniz eksik etmeyiniz. Mesela ASM dışında yazılan kodları daha küçük ve hızlı tutmak (optimization) nasıl mümkün olur?

Dip Not: Arkadaşlar forumda HEX kodları boşuna vermeyin. Hem anlamsız oluyor, hem de bir işe yaramıyor. Yani ilk defa forumdan alıp metin editörüne yapıştırdım ama kod hata verdi. Herhalde satır sonu karakterlerinden kaynaklanıyor. En iyisi yukarıdaki gibi kodun bir kısmını verip altına Yahoo'daki yerimizi yönlendirme yapalım.

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

fsan

Alıntı yapılan: "DumrulBey"Merhaba,
Fikret, ben PIC Basic fazla bilmem ama kodların HEX boyutlarını merak ettim ve derledim.
dogrudur üstat picbasic pro nun dezavantajlarindan birisi de bu; hex boyutlarini ASM dan daha büyük yapmasi.. "and", "while" kullaninca kod kisa oluyor ama bu seferde hex kodu biraz daha büyük oluyor :\
Alıntı YapParantezler nedeniyle derleme hatası aldım. Peki ya sen nasıl derledin? Ben derlemeyi Proton+ 2.1.3 ile yaptım. Sonra parantezleri kaldırınca sorunu aştım.
MicroCode Studio da picbasic pro compile özelligi ile.. sorunsuz compile edildi belki protonda biraz farkli yazilmasi gerekiyordur.
Alıntı YapAyrıca Erol'dan farklı olarak ne yaptığını anladım, yani kodu toparlamaya çalışmışsın. Ancak bu sefer zamanlama kısmı hatalı olmuş. Eğer gecikme bitene kadar basarsan LED yanıyor. Sanırım arkadaşımız böyle bir özellik istemedi. Yoksa ben mi yanlış anladım?
olabilir ben yanlis anlamis olabilirim.. ayrica Süre konusunda haklisin (2 saniye icin SURE 2000 yerine mesela 1800 yapilip denenebilir) ETE arkadasin yaptigi simülasyonu denedigimde BUTONA iki saniye gecmedende arka arkaya basip birakincada cikistaki LED yanip sönüyordu ama simdi enaz 2 saniye basik tutmak gerekir
Alıntı YapSözümün başında dediğim gibi boyutları merak ettim ve her zaman ki gibi ASM (211 bayt) ile yapılan çok az yer tuttu. Fakat bir şey dikkatimi çekti! Fikret'in yaptığı (730 bayt), Erol'un yaptığından (513 bayt) daha büyüktü. Acaba gecikme ile ilgili değişiklik nedeniyle bu kadar büyüdü. Yoksa şartlı satırları birleştirmek kodu büyütüyor olabilir mi?
Soru: "Yoksa şartlı satırları birleştirmek kodu büyütüyor olabilir mi?"
Cevap: evet bundan kaynaklaniyor
Alıntı YapŞimdi araştırıyorum bu vesileyle PIC Basic'e de adım atıyorum. Üstesinden gelinemeyecek bir dil değil ama hala ısınamadım.
dogru bende baslangicta hic pic ten anlamazken ASM a isinamamistim o yüzden picbasic kullaniyorum :)
Alıntı YapAcaba C kodu ile yapılanlar daha iyimi olur diye hep düşünüyorum.
Bence Microcode Studio ile Picbasic pro icin program yazmak C den daha kolay, anlasilmasi kolay ve daha mantikli cümleler.. ama C nin daha gelismis bir dil oldugunu söyleniyor ve cok gelismis programlar yapacaksak mutlaka ögrenmemiz gerekir..
ayrica C de interrupt olayi nasildir bilmiyorum ama Picbasic pro dakine nasil olduda interupt diye adlandirdilar anlamiyorum.. cok sacma birsey (software interrupt :P)

Sevgiler, saygilar...

ete

Power Arkadaş,

Sende fikrini yazarsan bizde gerçekten neyi istediğini anlarız sanırım.
Zira fazla detay verilmeden yapılan isteklerden ne gibi sonuçlar çıkıyor görüyorsun. Haklı olarak herkes anladığı şekilde programlara yaklaşıyor.
Umarım sorunun hallolmuştur. Bizi de merak sarıyor acaba gerçekten halloldumu diye.

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

POWER

Değerli arkadaşlar yorumlarınızdan dolayı çok teşekkür edereim.Tabiki sonuç hakkında yorum yazacaktım fakat verilen yazılımı dün akşam fazla detaylı olmasada uygulam imkanım oldu.Butona 2 saniye basılı tutup bıraktığımda led yanıyor.Tam tersi butona 2 saniye basılı tutup bıraktığımda led sönüyor.Esasında benim istediğim; Butona basınca 2 saniye sonunda ledin yanması akabinde butona tekrar basıp 2 saniye sonunda ledin sönmesi.Ledin yanması yada sönmesi için butondan elin çekilmesi değil.Yani tek hareketle ledin yanması ve sönmesi.İkinci konu pıc e ilk voltaj geldiğinde ledin sönük olması daha avantajlı olacak.Teşekkürler.
TB6BKG

DumrulBey

Merhaba,

Tamam, herhalde yanlış anlamamışım. O zaman Erol'un PBP ile yazılmış kodu veya benim ASM ile yazıldığım kodu kullanabilirsin. İkisi de aşağı yukarı aynı kapı.

Zaten LED başta sönüktür. Değilse bile başa (döngü dışına) CLRF PORTB veya ilgili LED'in adresini yazarak mesela benim programda BCF PORTB, 7 yaparsın olur biter.

Bu arada tavsiyem RC osilatör kullan. Eğer bu programcığı başka program içinde kullanmayacaksan bu daha ekonomik olur ve daha az yer kaplar. Tabii 2 saniye kararlılığı önemli değilse.

Kolay gelsin...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

ete

POwer arkadaş,

Dumrul Beyin dediği gibi benim verdiğim program ve Hex kodu istediğin kod. ayrıca İsis te işin simulasyonuda var. Yukarıda Yahoo Groups daki yerinide vermiştim. Bir bakıver.

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

POWER

Değerli arkadaşlar

İlk denememde kısmen çalışan proğramı sonraki ayrıntılı denemelerimde çalıştıramadım.Formun başında sizlerin görüşüne sunduğum tek butondan gecikmesiz olarak ilgili ledi yakıp söndüren yazılım çalışıyor.Pıc mi arızalandı diye düşündüm yenisini aldım fakat sonuç değişmedi.Bağlantı şeklini formda görüntüleyemediğim için yazı ile anlatacağım. Yazılımdan anladığım kadarıyla;Led  RB7 ye bağlı. RB0 10K lık dirençle (-) ye bağlı.Butonun bir ucu +5V ta diğer ucuda RB0 bağlı.Led hiç yanmıyor.Öncelikle bağlantı şeklinin doğru olup olmadığı konusunda yardımlarınızı bekliyorum. Kolay gelsin
TB6BKG

fsan

merhaba
arkadasim baglanti seklini ben bu resimde göstermeye calistim.. LEDi nasil bagladigini bilmiyorum ama semadaki iki alternatif ten birisidir mutlaka :)
Mesaj konusu: gecikmeli on-off

http://home.no/fsan/projects/Diverse/Button_delay/

POWER

Tüm arkadaşlara yorumlarından dolayı teşekkürler.fsan arkadaşımızın son gönderdiği şema yazılım sorunsuz olarak çalışmakta.Son olarak yazılımı PicBasic Pro ile yazdın.Bu konularda oldukca acemi olduğum için soruyorum.Tüm arkadaşlara kolay gelsin
TB6BKG

POWER

***********DÜZELTME***************
Tüm arkadaşlara yorumlarından dolayı teşekkürler.fsan arkadaşımızın son gönderdiği şema+yazılım sorunsuz olarak çalışmakta.Son olarak yazılımı PicBasic  ilemi yazdın?Bu konularda oldukca acemi olduğum için soruyorum.Tüm arkadaşlara teşekkürler.Kolay gelsin
TB6BKG

fsan

bisey değil arkadasim
evet asagidaki kod MicroCode Studio ile yazildi.. Harika bir Picbasic pro editoru.. denemenizi tavsiye ederim

yukarida verdigim sema icin Dosyalar burada - http://home.no/fsan/projects/Diverse/Button_delay/
@ device  pic16f84, xt_osc, wdt_off, pwrt_on, protect_off
 
' Oscillator speed in MHz: 3(3.58) 4 8 10 12 16 20 24 25 32 33 40 
DEFINE OSC 4

TRISA = %11111
PORTA = 0
TRISB = %0000001
PORTB = 0

'***************
Delay   CON 2000 'Button Delay time
'***************

Counter VAR WORD
DoOnce  VAR BIT

PButton VAR PORTB.0
Led     VAR PORTB.7

'******
Led = 0 ' Led ON/OFF at startup
'******

DoOnce = 0

Main:
    if (PButton = 1) and (DoOnce = 0) then
        DoOnce = 1
        Counter = 0
        while (PButton = 1) and (Counter < Delay)
            Counter = Counter + 1
            pause 1
        wend
        if Counter = Delay then TOGGLE Led
    endif
    if (PButton = 0) and (DoOnce = 1) then DoOnce = 0
goto Main

end

Kolay gelsin

POWER

Değerli arkadaşlar;
Eproje formunda yayınlanan  PWM 12VDC-220VAC 150W Invertör devresini 2-3 ay önce yapmıştım.Verimi oldukca iyi.O zaman aklımdan bu projeyi ful  kesintisiz güç kaynağı(ups) yapma fikri aklıma yer etmişti.Bunun üzerine çalışmalar başladım bir şeyler yaptım ama sonucundan bende memnun olmadım.Benim yaptığım devre analog.Eleman sayısı çok fazla.Sadece gecikmeli olarak on-off yapabilmek için  2 tane entegre ve 10-15 tane pasif eleman kullanmak zorunda kaldım.Daha sonra kontrol ünitesini pic kontrollü yapmak geldi aklıma.Ama bu proğramı yazacak kadar bilgim malesef bende yok. 2 tane entegre ve 10-15 tane pasif eleman kullanarak yaptığım gecikme ile açıp kapanma olayını siz tecrübeli arkadaşlar 3-4 elemanla çözdü.

Şayet yardımcı olabilirseniz Ben bu devreyi pic kontrollü ups yapıp bu formda yayınlayarak tüm arkadaşların kullanımına sunmak istiyorum.Yapılması gereken üç ana nokta var.
1-Şebeke voltajını sürekli izleyerek 170-140 VAC  nin dışına çıkıldığı zaman(Bu değişebilir)portlardan birisinden bir çıkış voltajı almak için yazılım.
2- Şebeke voltajını sürekli izleyerek kesinti halinde portlardan birisinden çıkış voltajı almak için yazılım.
3-Sürekli akü voltajını izleyerek  akü voltajının 10.5 yada 10V düşmesi halinde portlardan birisinden çıkış voltajı almak  için yazılım.
Ne dersiniz arkadaşlar bu şekilde bir yazılım yapılabilir mi?  Benim yazılım konusunda pek fazla bilgim olmadığım için sizin yorumlayacağınız fikirleri denemek ve olumlu yada olumsuz sonuçlarını bildirmek.Elimden bu kadarı geliyor şimdilik.  KOLAY GELSİN
TB6BKG