Pici bloke etmeden bekleme yapmak

Başlatan erdemefe, 04 Ekim 2010, 00:02:29

erdemefe

arkadaşlar 16f876 kullanarak proton dilinde bir voltmetre ampermetre devresi yaptım çalışması şu şekilde program başta hesaplamaları yapıyor ve ekrana gidiyor ekranda 500ms bekleme yapıyor ve başa dönüyor hesaplamalarımda ölçümlerimde hiçbir sorun yok gayet kararlı bir şekilde çalışıyor fakat istediğim bir şeyi yapamıyorum isteğim ise şöyle voltaj 14.4 volta geldiğinde 5 saniye beklesin ardından pic bir çıkış versin 14.4ün altına düştüğünde ise yine 5 sn sonra çıkışı kessin bunu şu kod parçalarıyla yapıyorum

if HVD>144 then
delayms 5000
high portc.3
else
low portc.3
endif

bu şekilde yaptığımda voltaj 14.4ün üstüne çıktığında 5snlik bekleme bölümüne geliyor ve bu arada hiçbir işlem yapmıyor voltajı göstermiyor buda işime gelmiyor haliyle ben nasıl pic voltaj ölçmeye devam ederken 5sn gecikme koyabilirim?
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [Erdem EFE]                                       *
'*  Notice  : Copyright (c) 2009 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 31.10.2009                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device 16F876
Declare LCD_DTPIN PORTB.4
Declare LCD_RSPIN PORTB.1
Declare LCD_ENPIN PORTB.3
Declare LCD_RWPIN PORTB.2
Declare LCD_INTERFACE 4
Declare LCD_LINES 2
Declare ADIN_RES 10
Declare ADIN_TAD FRC
Declare ADIN_STIME 50

ADCON1=%10001110
TRISA=%00010011
TRISB=0
TRISC=0

Dim VOLT As Word
Dim AMPER As Word
Dim HVD As Word
Dim HAD As Word
Dim HAM As Word

Dim MV As Byte
Dim MA As Byte
Dim i As Byte
Dim j As Byte
Dim k As Byte


Dim WATT As Float
Dim R As Float

PORTB=0
PORTA=0
VOLT=0
Low PORTC.2
Low PORTC.3
DelayMS 100
Cls

'Print At 1,1,"     ERDEM      "
'Print At 2,1,"HAZIRLANIYOR...."
'Cls 
Low PORTC.2
Low PORTC.3

BASLA:
ADIn 0,HAM

BAK:
If ADCON0.2=1 Then BAK
DelayMS 5

GoSub HESAPV

ADIn 1,HAM

DelayMS 5
GoSub HESAPA

GoSub HESAPW
DelayMS 5

GoSub HESAPR
DelayMS 5

If HVD>144 Then
High PORTC.3
Else 
Low PORTC.3
EndIf

GoSub EKRAN
GoTo BASLA

EKRAN:
Print At 1,1,"V=",DEC2 VOLT,".",DEC1 MV   
Print At 2,1,"A=",DEC2 AMPER,".",DEC1 MA
Print At 1,9,"W=",#WATT
Print At 2,9,"R=",#R
DelayMS 500
Return

HESAPV:
HVD=(HAM+1)*/150
VOLT=HVD/10
MV=(HVD)//10
Return

HESAPA:
HAD=(HAM+1)*/125
AMPER=HAD/10
MA=(HAD)//10
Return

HESAPW:
WATT=(HVD*HAD)/100
Return

HESAPR:
R=(HVD/HAD)
Return

End

muhittin_kaplan

voltaj gösterme bölümünü bir alt program yapın. bir değişkenle orada for för döngüsü kurun. 14.4 v geçince 5sn lik gecikme sağlasın. deri dönsün. eğer 14.4 ün altındasa for için kullandığınızdeğişken değeri farklı olsun. daha az beklesin.

muhittin_kaplan

#2

erdemefe

teşşekkür ederim kardeş deneyeceğim

Tagli

Timer1 uygun şekilde ayarlanırsa bu iş olabilir. 5 saniyede taşması için gereken değer timer1'e yazılır ama timer çalıştırılmaz. 5 saniye beklemek istendiğinde timer çalıştırılır, sonra kesme gelene kadar PIC normal işine devam eder. Kesme gelince gereken işlemi yapar, timer'ı kapatır ve içine daha önceki başlangıç değerini yükler.
Gökçe Tağlıoğlu

erdemefe

arkadaşlar cevaplar için çok teşekkür ederim fakat pic programlamaya biraz yabancıyım bu kadarınıda zaten arkadaşların yardımları ile hallettim hatta kesme ile ilgili daha önce hiç denemem bile olmadı söyledikleriniz biraz yabancı geldi acaba küçük kod parçalarıyla yardımcı olabilirmisiniz hemde olayı daha iyi kavramış olurum

erdemefe

arkadaşlar aşağıdaki satırlarla voltajın istediğim noktaya gelince ekrandaki 250mslik beklemeyi kullanması için for ile 20 kez ekrana gidip gelmesini ve ardından röleyi çekmesini sağlamak istedim fakat beceremedim yine olmadı acaba sorun nerede olabilir

If HVD>143 Then
For i=0 To 20
GoSub EKRAN
High PORTC.3
Next i
Else
Low PORTC.3
EndIf

omereliusuk

#7
IF HVD<143 THEN                             'HVD 143 DEN KÜÇÜKSE TEKRAR ET
repeat
GoSub EKRAN
GOSUB VOLTAJOKU
GOSUB DIGER_BAKACAGIN_YERLER 'ARTIK NERELERSE
High PORTC.3
until HVD>143                    'HVD 143 DEN KÜÇÜKSE 143 DEN BÜYÜK OLUNCAYA KADAR TEKRAR ET
ElseIF HVD>143 THEN 'HVD 143 DEN BÜYÜKSE
DELAYMS 10 ' 10 MS BEKLE
Low PORTC.3
EndIf

İNŞALLAH OLMUŞTUR

erdemefe

teşekkür ederim ama olmadı heralde okumada sorun çıktı bu sefer voltaj 14.4ü geçince düşmeye başlıyor isterseniz dosyyı yükliyim birde siz bakın
http://hotfile.com/dl/74025633/bd718bd/volt.rar.html

ete

Bence problem çok iyi anlaşılmamış.
Nedir istenen;
- Program kesinti olmaksızın ADC okumalarını ve hesaplamaları yapıp ekrana değerleri verecek.
- Okunan voltaj 14,4V (144 olarak okunacak) değerini aşar ise,  5 sn bekleyecek ama bu arada ADC okumaları ve ekran gösterimleri devam edecek ve 5 sn süresinin bitiminde PortC.3 set edilecek.
- Okunan Voltaj  144 değerin altına düşer düşmez yine 5 sn sayacı saymaya başlayacak ve bu arada yine ADC okumaları ile hesaplamalar ve ekran gösterimleri devam edecek ve 5sn sürenin sonunda PORTC.3 yeniden RESET yani LOW yapılacak.
- Bu işlem okunan voltajın 144 değerini aşması ile aynı şekilde tekrar edecek.
Benim anladığım budur. Yanlışım varsa düzeltin.
Tabiiki 5 sn sayacı sayar iken voltajda yeniden değişiklik olursa ne olacak o belirtilmemiş.
Örneğin Voltaj 144 değerini aştı ve sayac saymaya başladı. Henüz 5 sn dolmadan voltaj tekrar 144 değerinin altına inerse ne olacak?.
Tabiiki birde bunun tersi var. PortC.3 set edildi ve voltaj 144 değerinin altına düştü . Sayac saymaya başladı ancak bu esnada voltaj yeniden 144 değerini aşar ise ne olacak?

Ete

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

erdemefe

Hocam "Benim anladığım budur." cümlenizdekinden üstünde yazdıklarınız aynen benim istediğim. voltaj 144 değerinin üstüne çıkıp sayaç başladığında ve sayaç 5 snyi doldurmadan tekrar 144ün altına indiğinde PORTC.3 hiçbir tepki vermeyecek 144ün altındaymış gibi low olmaya devam edecek PORTC.3ün HIGH olması ancak 144ün üstünde ve 5sn sayacının dolması sonucunda olacak. aynı şekilde voltaj 144den aşşağı düştüğünde 5sn sayacı dolmadan PORTC.3 LOW olmayacak eğer 5sn dolmadan tekrar 144ün üstüne çıkarsa busefer PORTC.3 high olmak için 5sn sayacını başlatacak. Tabiki bu sayaclar sayarken pic her an ADC okumaya devam edip yeni değerleri ekranda gösterecek.

pcb

#11
İstediğin gibi bir programı yazmaya çalışdım, oldu sanırım, referans voltaj üzerinde iken kısa süreli referans altına sallanmalarda port çıkışı değişmiyor veya tersi durumda
Port çıkışı değişmesi için 5n veya ayarlayacağın süre aşılmalı

Device 16F876
Xtal    =   20
On_Interrupt GoTo TIMER_0

Declare LCD_DTPin PORTB.4
Declare LCD_RSPin PORTB.1
Declare LCD_ENPin PORTB.3
Declare LCD_RWPin PORTB.2
Declare LCD_Interface 4
Declare LCD_Lines 2
Declare Adin_Res 10
Declare Adin_Tad FRC
Declare Adin_Stime 50

'__________________INTRRUPTS_________________________________TMR0 TIMER
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
Symbol GIE = INTCON.7  ' Global Interrupt Enable

GIE=0   
T0IF=0  'TMR0 OVERFLOW INT FLAG
T0IE=1  'TMR0 OVERFLOW  INT ENABLE

OPTION_REG=%1000111
'____________________________________________________________
ADCON1=%10001110
TRISA=%00010011
TRISB=0
TRISC=0

Dim VOLT As Word
Dim AMPER As Word
Dim HVD As Word
Dim HAD As Word
Dim HAM As Word

Dim MV As Byte
Dim MA As Byte
Dim i As Byte
Dim j As Byte
Dim k As Byte


Dim WATT As Float
Dim R As Float

Dim SAY As  Word
SAY =   0
Dim GG  As  Byte
Dim GM  As  Byte
'////////////
GG  =   0
GM  =   1
'////////////

PORTB=0
PORTA=0
VOLT=0
Low PORTC.2
Low PORTC.3
DelayMS 100
Cls

'Print At 1,1,"     ERDEM      "
'Print At 2,1,"HAZIRLANIYOR...."
'Cls 
Low PORTC.2
Low PORTC.3         'LOW KALMALI BASLANGICDA



BASLA:

ADIn 0,HAM

BAK:
If ADCON0.2=1 Then BAK
DelayMS 5

GoSub HESAPV

ADIn 1,HAM

DelayMS 5
GoSub HESAPA

GoSub HESAPW
DelayMS 5

GoSub HESAPR
DelayMS 5

'If HVD>144 Then
'High PORTC.3
'Else 
'Low PORTC.3
'EndIf

'******************************************************************************************************************  
If  HVD>144 Then    
 Select  GG
 Case    0
    If SAY>0   Then '|
    T0IF   =   0    '|
    GIE=0           '|
    SAY =   0       '| AYARLADIGIN REFERANS VOLT DEĞER UZERINDE, BIR PORT HIGH IKEN KISA SURELI (5SN DEN KISA)
    GM  =   0       '|
    GG  =   1       '| DALGALANMALARDA (REFERANS ALTINA INME) HIGH YAPTIĞIN PORTTA DEGISIKLIK OLMAZ
    GoTo    BASLA   '|
    EndIf           '|
 GIE    =   1    
 Inc GG                     '| DEGER 144 U GEÇTİĞİNDE SADECE 1 KERE 5SN SONRA BİR PORT U AKTIV ETMEK ICIN
 GM =   0    
 EndSelect
EndIf

If  HVD<144 Then
 Select GM
 Case   0
    If SAY>0   Then  '|
    T0IF   =   0     '| 
    GIE =   0        '| 
    SAY =   0        '| AYARLADIGIN REFERANS VOLT DEĞER ALTINDA, BIR PORT Low IKEN KISA SURELI (5SN DEN KISA) 
    GM  =   1        '|
    GG  =   0        '| DALGALANMALARDA (REFERANS UZERINE CIKMA) Low YAPTIĞIN PORTTA DEGISIKLIK OLMAZ
    GoTo    BASLA    '|
    EndIf            '|
 GIE    =   1    
 Inc GM
 GG =   0                    '| DEGER 144 DEN AZALDIĞINDA SADECE 1 KERE 5SN SONRA BİR PORT U DEAKTIV ETMEK ICIN
 EndSelect                   ' BU DONGULER ÇOK FARKLI ŞEKİLLERDE YAZILABİLİR
EndIf
'****************************************************************************************************************** 

GoSub EKRAN
GoTo BASLA
'//////////////////////////////////////////
EKRAN:
Print At 1,1,"V=",Dec2 VOLT,".",Dec1 MV   
Print At 2,1,"A=",Dec2 AMPER,".",Dec1 MA
Print At 1,9,"W=",#WATT
Print At 2,9,"R=",#R
DelayMS 500
Return

HESAPV:
HVD=(HAM+1)*/150
VOLT=HVD/10
MV=(HVD)//10
Return

HESAPA:
HAD=(HAM+1)*/125
AMPER=HAD/10
MA=(HAD)//10
Return

HESAPW:
WATT=(HVD*HAD)/100
Return

HESAPR:
R=(HVD/HAD)
Return

End
'//////////////////////INTERRUPT RUTIN/////////////////////////////////////////////
TIMER_0:                    'ZAMANI AYARLA
 Inc    SAY                 '381 TIMER SURESIDIR 5SN, PROTEUSDA HER TMR0 DONGUSU 13,13ms GORULMEKTE
 If SAY=381   Then          '381*13,13ms = 5SN , AYAR DEĞİŞTİRİLEBİLİR. 
 Toggle   PORTC.3           'AKTIF ETMEK ISTEDIGIN PİN 
 GIE    =   0               
 Clear  SAY
 T0IF   =   0
 GoSub EKRAN
 GoTo BASLA
 EndIf
 
 T0IF   =   0               'TIMER0 BAYRAGI TEMIZLE
 Context Restore 
 Resume
'////////////////////////////////////////////////////////////////////////////////// 
  'voltaj 14.4 volta geldiğinde 5 saniye beklesin ardından pic bir çıkış versin 14.4ün altına düştüğünde
  'ise yine 5 sn sonra çıkışı kessin bunu şu kod parçalarıyla yapıyorum

Include "FONT.INC"

Ruzgarbey

#12
Alıntı yapılan: pcb - 06 Ekim 2010, 02:50:57
İstediğin gibi bir programı yazmaya çalışdım, oldu sanırım, referans voltaj üzerinde iken kısa süreli referans altına sallanmalarda port çıkışı değişmiyor veya tersi durumda
Port çıkışı değişmesi için 5n veya ayarlayacağın süre aşılmalı

Device 16F876
Xtal    =   20
On_Interrupt GoTo TIMER_0

Declare LCD_DTPin PORTB.4
Declare LCD_RSPin PORTB.1
Declare LCD_ENPin PORTB.3
Declare LCD_RWPin PORTB.2
Declare LCD_Interface 4
Declare LCD_Lines 2
Declare Adin_Res 10
Declare Adin_Tad FRC
Declare Adin_Stime 50

'__________________INTRRUPTS_________________________________TMR0 TIMER
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
Symbol GIE = INTCON.7  ' Global Interrupt Enable

GIE=0   
T0IF=0  'TMR0 OVERFLOW INT FLAG
T0IE=1  'TMR0 OVERFLOW  INT ENABLE

OPTION_REG=%1000111
'____________________________________________________________
ADCON1=%10001110
TRISA=%00010011
TRISB=0
TRISC=0

Dim VOLT As Word
Dim AMPER As Word
Dim HVD As Word
Dim HAD As Word
Dim HAM As Word

Dim MV As Byte
Dim MA As Byte
Dim i As Byte
Dim j As Byte
Dim k As Byte


Dim WATT As Float
Dim R As Float

Dim SAY As  Word
SAY =   0
Dim GG  As  Byte
Dim GM  As  Byte
'////////////
GG  =   0
GM  =   1
'////////////

PORTB=0
PORTA=0
VOLT=0
Low PORTC.2
Low PORTC.3
DelayMS 100
Cls

'Print At 1,1,"     ERDEM      "
'Print At 2,1,"HAZIRLANIYOR...."
'Cls 
Low PORTC.2
Low PORTC.3         'LOW KALMALI BASLANGICDA



BASLA:

ADIn 0,HAM

BAK:
If ADCON0.2=1 Then BAK
DelayMS 5

GoSub HESAPV

ADIn 1,HAM

DelayMS 5
GoSub HESAPA

GoSub HESAPW
DelayMS 5

GoSub HESAPR
DelayMS 5

'If HVD>144 Then
'High PORTC.3
'Else 
'Low PORTC.3
'EndIf

'******************************************************************************************************************  
If  HVD>144 Then    
 Select  GG
 Case    0
    If SAY>0   Then '|
    T0IF   =   0    '|
    GIE=1           '|
    SAY =   0       '| AYARLADIGIN REFERANS VOLT DEĞER UZERINDE, BIR PORT HIGH IKEN KISA SURELI (5SN DEN KISA)
    GM  =   0       '|
    GG  =   1       '| DALGALANMALARDA (REFERANS ALTINA INME) HIGH YAPTIĞIN PORTTA DEGISIKLIK OLMAZ
    GoTo    BASLA   '|
    EndIf           '|
 GIE    =   1    
 Inc GG                     '| DEGER 144 U GEÇTİĞİNDE SADECE 1 KERE 5SN SONRA BİR PORT U AKTIV ETMEK ICIN
 GM =   0    
 EndSelect
EndIf

If  HVD<144 Then
 Select GM
 Case   0
    If SAY>0   Then  '|
    T0IF   =   0     '| 
    GIE =   1        '| 
    SAY =   0        '| AYARLADIGIN REFERANS VOLT DEĞER ALTINDA, BIR PORT Low IKEN KISA SURELI (5SN DEN KISA) 
    GM  =   1        '|
    GG  =   0        '| DALGALANMALARDA (REFERANS UZERINE CIKMA) Low YAPTIĞIN PORTTA DEGISIKLIK OLMAZ
    GoTo    BASLA    '|
    EndIf            '|
 GIE    =   1    
 Inc GM
 GG =   0                    '| DEGER 144 DEN AZALDIĞINDA SADECE 1 KERE 5SN SONRA BİR PORT U DEAKTIV ETMEK ICIN
 EndSelect                   ' BU DONGULER ÇOK FARKLI ŞEKİLLERDE YAZILABİLİR
EndIf
'****************************************************************************************************************** 

GoSub EKRAN
GoTo BASLA
'//////////////////////////////////////////
EKRAN:
Print At 1,1,"V=",Dec2 VOLT,".",Dec1 MV   
Print At 2,1,"A=",Dec2 AMPER,".",Dec1 MA
Print At 1,9,"W=",#WATT
Print At 2,9,"R=",#R
DelayMS 500
Return

HESAPV:
HVD=(HAM+1)*/150
VOLT=HVD/10
MV=(HVD)//10
Return

HESAPA:
HAD=(HAM+1)*/125
AMPER=HAD/10
MA=(HAD)//10
Return

HESAPW:
WATT=(HVD*HAD)/100
Return

HESAPR:
R=(HVD/HAD)
Return

End
'//////////////////////INTERRUPT RUTIN/////////////////////////////////////////////
TIMER_0:                    'ZAMANI AYARLA
 Inc    SAY                 '381 TIMER SURESIDIR 5SN, PROTEUSDA HER TMR0 DONGUSU 13,13ms GORULMEKTE
 If SAY=381   Then          '381*13,13ms = 5SN , AYAR DEĞİŞTİRİLEBİLİR. 
 Toggle   PORTC.3           'AKTIF ETMEK ISTEDIGIN PİN 
 GIE    =   0               
 Clear  SAY
 T0IF   =   0
 GoSub EKRAN
 GoTo BASLA
 EndIf
 
 T0IF   =   0               'TIMER0 BAYRAGI TEMIZLE
 Context Restore 
 Resume
'////////////////////////////////////////////////////////////////////////////////// 
  'voltaj 14.4 volta geldiğinde 5 saniye beklesin ardından pic bir çıkış versin 14.4ün altına düştüğünde
  'ise yine 5 sn sonra çıkışı kessin bunu şu kod parçalarıyla yapıyorum

Include "FONT.INC"

Sayın ustam bildiğim kadarı ile Kesmelerde GOTO veya GOSUB komutu kullanılamaz.biz basicte kullanamıyoruz.
basic olarak anladığımkadarı ile bir kod yazayım.hesaplama ve ekran kodlarınızı bir alt rutin olarak yazıyorum.

ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
INTCON = %10100000       'TIMER0 KSMESI AKTİF
OPTION_REG=%00010101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
timer0=0
say var byte
sayac var byte

main:
sayac=0
gosub hesapla
gosub ekran

Do While Volt >144
if sayac=5 then Portc.3=1 '5 saniye boyunca volt 14.4 üstündeyse çıkış ver.
gosub hesapla
gosub ekran
wend
sayac=0
Do While Volt <144
if sayac=5 then Portc.3=1 '5 saniye boyunca volt 14.4 altındaysa çıkış ver.
gosub hesapla
gosub ekran
wend
goto main


Disable
KESME:
GIE=0
say=say+1
ıf say=60 then
say=0
sayac=sayac+1
endif
INTCON.2=0
GIE=1
enable
Resume


Basit bir kod yazmaya çalıştım.benim mantığım bu şekilde düşündü : umarım kodun yararı olur. protona uyarlarsınınz.saygılarımla..




Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

pcb

Konu ile alakalı arkadaş çoktan programı aldı gitti arkasına bakmadan ama yine de şunu söyleyeyim yazdığınız programda gerçekleşecek tek şey, devre çalışmaya başladıktan 5sn sonra PORTB.3 ün çıkış vermesidir, sonra ister volt değer düşsün ister düşmesin hiç bir şey değişmiyor.
Bizim yapmaya çalıştığımız ise ayrı bir şey. Arkadaşın açıklamasını tekrar okuyun lütfen
interrupt içinde goto vs kullanılmayabilir ama gosub - goto kullanılan döngüye girildiğinde timer0 kapatılıyor , interrupt iptal ediliyor dolayısı ile interrupt la alakası yok diye düşünüyorum.

erdemefe

arkadaşlar ikinizede çok teşekkür ederim ben programı kesme oluşturmadan kendi imkanlarımla oluşturmuştum siz mesajları yazmadan önce şu anda sizin yazdığınız kodları anlamaya çalışıyorum benim mantığımda şu şekildeydi ne kadar doğru ne kadar yanlış bilmiyorum a diye bir değişken oluşturup programda başla ile ekran arasında bir yere a=a+1 gibi bir satır ekledim program her ekranı yenilemede değişkeni 1 artırıyor hemde ekrandaki 500ms lik beklemeyi kullanıyor değişken 10 olduğunda 5sn geçmiş oluyor bir if mukayesesi ile değişken 10dan büyük olduğunda çıkış veriyor aynı şekilde istenilen voltajın altına düştüğünde başka bir değişken sayıp 10 olduğunda ilk değişkeni yani a'yı sıfırlıyor