16f877a çıkışı ilk enerjide aktif oluyor

Başlatan F®T, 01 Ekim 2011, 18:38:27

F®T

herkese iyi çalışmalar.
karta enerjiyi ilk verdiğim anda 16f877a nın rc.1 rc.2 rc.3 ve rb.7 çıkışları aktif oluyor sonra programa göre normal seyrini alıyor.daha sonraki enerji kesmelerimde kartta enerji tam boşalmamışsa enerji verdiğimde bi sorun olmuyor bu çıkışlar aktif olmuyor.kesmede kontrol ettiğim 5 analog girişim var.acaba ilk enerjilenmede kartta enerji tamamen yok iken enerji verildiği anda analoglar hazırlanmadan dengesiz değerler oluşup kesmeye gidip bu değerlere göremi yanlış çıkış üretiyor.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Pic pinleri açılışta rastgele değer alırlar. Bu nedenle genelde asıl program başlama etiketine geçmeden evvel portları sıfırlamak gerekir.
Ete

F®T

Device 16F877A
XTAL = 20
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
TRISA=%11111111
TRISB=%01111111
TRISC=%11110001
TRISD=%11111111
TRISE=%111

Declare ADIN_RES 10     
Declare ADIN_TAD FRC     
Declare ADIN_STIME 50
ADCON1 = %10000000 
CMCON      = 7         

'*******************************************************************************
;GİRİŞ ÇIKIŞ SEMBOLLERİ

Symbol TRIPBUTONU   = PORTB.6     
Symbol TRIPOUT      = PORTB.7
Symbol RLED         = PORTC.3
Symbol SLED         = PORTC.2
Symbol TLED         = PORTC.1

'*******************************************************************************
;DEĞİŞKENLER
Dim   RHAM      As Word
Dim   TOP_R     As Word
Dim   R         As Byte 
Dim   SHAM      As Word
Dim   TOP_S     As Word
Dim   S         As Byte   
Dim   THAM      As Word
Dim   TOP_T     As Word
Dim   T         As Byte 
Dim   AKIMSET   As Word
Dim   DELAY     As Word
Dim   DELY     As Word
Dim   G         As Word
Dim   H         As Word
Dim   RR        As Bit
Dim   SS        As Bit
Dim   TT        As Bit

;KESME AYARLARI
   
Symbol T0IE = INTCON.5         ' TMR0 Overflow Interrupt Enable
Symbol T0IF = INTCON.2         ' TMR0 Overflow Interrupt Flag
Symbol GIE  = INTCON.7          ' Global Interrupt Enable
Symbol PS0  = OPTION_REG.0      ' Prescaler ratio bit-0
Symbol PS1  = OPTION_REG.1      ' Prescaler ratio bit-1
Symbol PS2  = OPTION_REG.2      ' Prescaler ratio bit-2 
Symbol PSA  = OPTION_REG.3      ' Prescaler Assignment (1=assigned to WDT 0=assigned to oscillator) 
Symbol T0CS = OPTION_REG.5     ' Timer0 Clock Source Select (0=Internal clock 1=External PORTA.4)

'******************************************************************************* GIE = 0                         ' Turn off global interrupts
PSA  = 1                         ' Assign the prescaler to İNTERNAL oscillator
PS0  = 1                         ' Set the prescaler
PS1  = 1                         ' to increment TMR0
PS2  = 1                         ' every 256th instruction cycle
T0CS = 0                        ' Assign TMR0 clock to internal source
TMR0 = 56                       ' Clear TMR0 initially
T0IE = 1                        ' Enable TMR0 overflow interrupt
GIE  = 1                         ' Enable global interrupts


On Interrupt GoTo KESME

RLED=1
GoSub ZAMAN
RLED=0
SLED=1
GoSub ZAMAN
SLED=0
TLED=1
GoSub ZAMAN
TLED=0

CLEAR

;ANA PROGRAM
       
        BASLA:
       
        AKIMSET=ADIn 3
        DelayUS 10
        DelayUS 10
        DELAY  =ADIn 4
        DelayUS 10
        DelayUS 10
                                       
        GoSub R_AKIM
        GoSub S_AKIM
        GoSub T_AKIM
        GoSub CIKIS
        GoSub TEST       
                             
        GoTo BASLA


ETE hocam haklısınız.ana döngü bu.kartta sıfır enerji var iken çıkışlarımın hepsi olmaması gerekir iken 1 oluyor.ama sonra programa göre 0 oluyorlar.programda istediğim gibi çalışıyor.fakat enerjiyi kesip bi miktar bekleyip tekrar verince çıkışlarda hiç bir sorun oluşmuyor.bu durum benim için bir sıkıntı oluşturuyor.configrasyonlarla alakalımı anlamadım.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

3mZ

ferit
Böyle denedinmi hiç bir şey değişiyormu
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
Device 16F877A
XTAL = 20

3mZ

F®T

selamlar.
evet aslında genel kullanım ne ise o şekil denedim.genelde ETE hocamın kullanım şekli port sıfırlama ve tanımlama şeklinde  bende öyle yaptım .ama bence farklı bir durum oluyor gibi.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

#5
Programın en başında portları sıfırlamış olmanız onların anında sıfır değeri alması anlamına gelmiyor. Port sıfırlama işlemini mümkün olduğunca sona ve başla satırından hemen öncesine bırakın. Sonucun daha iyi olduğunu göreceksiniz.
Senin sorununla pek çok defa karşılaştım. Tamamen işlemciye özel bir durum.
Kimisinde oluyor kimisinde olmuyor ama kesin çözüm başla satırından evvel portların sıfırlanması en başta değil. Zira en başta verilen komut daha registerlerin yerlerine oturmasından önce verilmiş bir komut oluyor ve çoğu zaman işe yaramıyor. En azından Basic de bu böyle oluyor.
Pic'i bir makine gibi düşünmeyin. Verdiniz komutu kesin uygular diye de düşünmeyin. En azında Basla satırından evvelkiler için bunu düşünmeyin.
İlk çalışmada şöyşe bir kafanızda canlandırın. Gerilim verilmiş sistem voltajı aldıkça besleniyor kapılar önce çalışamaz durumda bazı transistörler henüz doyuma ulaşmamış sürme işlemleri daha çalışamıyor ama yavaş yavaş damarlarda dolaşan kan gibi voltaj her yere ulaşıyor ve kalp başlıyor çalışmaya ve ilk emirleri yavaş yerine getiriyor. Bu arada siz emir olarak PortB=0 demişsiniz ama henüz PortB tam anlamı ile aktif olmamış. İşte sorun burada. Aktivasyon genelde açılışta verdiğiniz 250 ms lik gecikmeden sonra meydana geliyor. İşte sizinde port sıfırlama komutunuz bu gecikmeden sonra verilmelidir.

Ete

F®T

PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

basla:

ETE hocam, hem en başta, hemde başladan öncemi  bu şekil kullanmamı tavsiye ediyorsunuz.


     
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

pwm.c

önce TRIS sonra PORT registerlerini ayarlamayı dene bakalım.
Birde MCLR pinine 1uf bir kondansatör bağla.

TRISA=%11111111
TRISB=%01111111
TRISC=%11110001
TRISD=%11111111
TRISE=%111
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

ete

Tris registerlerinin yanında verdiğiniz port sıfırlama komutları genelde bir işe yaramıyor. Yada ara sıra işe yarıyor.
Şayet bir zorunluluk yok ise sıfırlama komutlarını aşağıda pause komutundan sonra verin.
Bazen bir pinin özellikle HIGH da açılması istenir yada bi pin sürekli kendiliğinden High da açılıyordur da size uygun değildir. O azaman pause den sonra verirseniz buda ters bir durum yaratır. O zaman pauseden önce denersiniz. Ama pauseden sonra verilenler kesin çalışıyor.

Ete

F®T

ETE hocam sıfırlama komutlarını aşağıda pause komutundan sonra veya önce verin demişsiniz.konuyu tam anlayamadım bir örnekle izah ederseniz memnun olurum.teşekkürler.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Yukarıda verdiğin programda;
En son SYMBOL tanımlamasından sonra;
PSA  = 1  şeklind ebir komut satırın var.
İşte bu satırdan evvel senin aslında Delay 250 şeklinde bir komut vermen gerekir idi.
Genelde değişken tanımlamalarından sonra bir gecikme verilir ve program reisterleri, değişkenleri işlemci rom'u tarafından kendi adreslerine ayarlanır.
Örneğin sen RHAM şeklinde bir değişken kullanmışsın. Bu 16 bitlik bir değişken. Pic bunun için 2 adet 8 bitlik register adresi kullanacaktır. Bu değişken ismi geçtiği yerde picin ayarladığı adresler kullanılacaktır. Sen basicde değişken ismi kullandın ama derleyici bunu ASM ye çevirince isim adrese döner. İşte bütün bunların ayarlanması için program başlamadan önce işlemciye biraz zaman tanımak gerekir buda yaklaşık 250 - 350 ms lik bir süredir. Kısa programlarda bu süre 150-200 ms ye ye düşebilir ama en iyisi 250 ms vermektir.
Bu öneriye bakarak senin programda en son SYMBOL tanımından sonra 50 ms lik bir gecikme koyuyoruz ve ardından PSA=1 komutu ile diğer satırları veriyoruz.
İşte Port Sıfırlama komutlarını bu gecikmeden sonra verirseniz kesinlikle işe yarayacaktır. Yani SYMBOL satırlarından sonra önce PORTA=0: PORTB=0 komutlarını ardından PSA=1 komutunu vermen gerekiyor.
Umarım anlaşılmıştır.

Ete

F®T

#11
hocam  dediklerinizi şimdi anladım.

Device 16F877A
@ CONFIG_REQ
@ __config CP_OFF & CPD_OFF & WDT_OFF & HS_OSC & PWRTE_ON & BODEN_OFF & WRT_256 & LVP_OFF & DEBUG_OFF
XTAL = 20
TRISA=%11111111
TRISB=%01111111
TRISC=%11110001
TRISD=%11111111
TRISE=%111

Declare ADIN_RES 10     
Declare ADIN_TAD FRC     
Declare ADIN_STIME 50
ADCON1 = %10000000 
CMCON      = 7         

'*******************************************************************************
;GİRİŞ ÇIKIŞ SEMBOLLERİ

Symbol TRIPBUTONU   = PORTB.6     
Symbol TRIPOUT      = PORTB.7
Symbol RLED         = PORTC.3
Symbol SLED         = PORTC.2
Symbol TLED         = PORTC.1

'*******************************************************************************
;DEĞİŞKENLER
Dim   RHAM      As Word
Dim   TOP_R     As Word
Dim   R         As Byte 
Dim   SHAM      As Word
Dim   TOP_S     As Word
Dim   S         As Byte   
Dim   THAM      As Word
Dim   TOP_T     As Word
Dim   T         As Byte 
Dim   AKIMSET   As Word
Dim   DELAY     As Word
Dim   DELY      As Word
Dim   G         As Word
Dim   H         As Word
Dim   RR        As Bit
Dim   SS        As Bit
Dim   TT        As Bit
Dim   FF        As Bit
Dim   TR        As Word

;KESME AYARLARI
   
Symbol T0IE = INTCON.5         ' TMR0 Overflow Interrupt Enable
Symbol T0IF = INTCON.2         ' TMR0 Overflow Interrupt Flag
Symbol GIE  = INTCON.7          ' Global Interrupt Enable
Symbol PS0  = OPTION_REG.0      ' Prescaler ratio bit-0
Symbol PS1  = OPTION_REG.1      ' Prescaler ratio bit-1
Symbol PS2  = OPTION_REG.2      ' Prescaler ratio bit-2 
Symbol PSA  = OPTION_REG.3      ' Prescaler Assignment (1=assigned to WDT 0=assigned to oscillator) 
Symbol T0CS = OPTION_REG.5     ' Timer0 Clock Source Select (0=Internal clock 1=External PORTA.4)


DelayMS 250


PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

'*******************************************************************************

PSA  = 1                         ' Assign the prescaler to İNTERNAL oscillator
PS0  = 1                         ' Set the prescaler
PS1  = 1                         ' to increment TMR0
PS2  = 1                         ' every 256th instruction cycle
T0CS = 0                        ' Assign TMR0 clock to internal source
TMR0 = 56                       ' Clear TMR0 initially
T0IE = 1                        ' Enable TMR0 overflow interrupt
GIE  = 1                         ' Enable global interrupts

On Interrupt GoTo KESME

;ANA PROGRAM
       
        BASLA:
       
teşekkür ediyorum.iyi günler.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete


F®T

ETE hocam aynı şekilde denedim fakat başarılı olmadı.acaba kesme ile ilgili bir sıkıntımı oluyor.şöyleki;analoglar tam oturmadan sistem kesmeye girip ordaki analogları okuyorsa farklı karşılaştırmalardan dolayı çıkış üretiyor olabilirmi.programın tamamını ekliyorum.inceleyebilirseniz sevinirim.yapmak istediğim 3 akım okumasını setlenen değeri geçince gecikme süresi dahilinde çıkışı yaptırmak.ayrıca setlenen akım noktasının 2.5 katı ani bir değer oluşursa beklemeksizin çıkışı aktif etmek.
acaba nerde mantıksal bir hata yapıyorum .illahiki bir eksiğim var.

Device 16F877A
@ CONFIG_REQ
@ __config CP_OFF & CPD_OFF & WDT_OFF & HS_OSC & PWRTE_ON & BODEN_OFF & WRT_256 & LVP_OFF & DEBUG_OFF
XTAL = 20
TRISA=%11111111
TRISB=%01111111
TRISC=%11110001
TRISD=%11111111
TRISE=%111

Declare ADIN_RES 10     
Declare ADIN_TAD FRC     
Declare ADIN_STIME 50
ADCON1 = %10000000 
CMCON      = 7         

'*******************************************************************************
;GİRİŞ ÇIKIŞ SEMBOLLERİ

Symbol TRIPBUTONU   = PORTB.6     
Symbol TRIPOUT      = PORTB.7
Symbol RLED         = PORTC.3
Symbol SLED         = PORTC.2
Symbol TLED         = PORTC.1

'*******************************************************************************
;DEĞİŞKENLER
Dim   RHAM      As Word
Dim   TOP_R     As Word
Dim   R         As Byte 
Dim   SHAM      As Word
Dim   TOP_S     As Word
Dim   S         As Byte   
Dim   THAM      As Word
Dim   TOP_T     As Word
Dim   T         As Byte 
Dim   AKIMSET   As Word
Dim   DELAY     As Word
Dim   DELY      As Word
Dim   G         As Word
Dim   H         As Word
Dim   RR        As Bit
Dim   SS        As Bit
Dim   TT        As Bit
Dim   FF        As Bit
Dim   TR        As Word

;KESME AYARLARI
   
Symbol T0IE = INTCON.5         ' TMR0 Overflow Interrupt Enable
Symbol T0IF = INTCON.2         ' TMR0 Overflow Interrupt Flag
Symbol GIE  = INTCON.7          ' Global Interrupt Enable
Symbol PS0  = OPTION_REG.0      ' Prescaler ratio bit-0
Symbol PS1  = OPTION_REG.1      ' Prescaler ratio bit-1
Symbol PS2  = OPTION_REG.2      ' Prescaler ratio bit-2 
Symbol PSA  = OPTION_REG.3      ' Prescaler Assignment (1=assigned to WDT 0=assigned to oscillator) 
Symbol T0CS = OPTION_REG.5     ' Timer0 Clock Source Select (0=Internal clock 1=External PORTA.4)



DelayMS 250

Clear

PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

'******************************************************************************* GIE = 0                         ' Turn off global interrupts
PSA  = 1                         ' Assign the prescaler to İNTERNAL oscillator
PS0  = 1                         ' Set the prescaler
PS1  = 1                         ' to increment TMR0
PS2  = 1                         ' every 256th instruction cycle
T0CS = 0                        ' Assign TMR0 clock to internal source
TMR0 = 56                       ' Clear TMR0 initially
T0IE = 1                        ' Enable TMR0 overflow interrupt
GIE  = 1                         ' Enable global interrupts

On Interrupt GoTo KESME

;ANA PROGRAM
       
        BASLA:
       
If FF=0 Then       
RLED=1
GoSub ZAMAN
RLED=0
SLED=1
GoSub ZAMAN
SLED=0
TLED=1
GoSub ZAMAN
TLED=0
FF=1
EndIf
       
        AKIMSET=ADIn 3
        DelayUS 10
        DELAY  =ADIn 4
        DelayUS 10
                                               
        GoSub R_AKIM
        GoSub S_AKIM
        GoSub T_AKIM
        GoSub CIKIS
        GoSub TEST       
                             
        GoTo BASLA
       
         CIKIS:
         If RR=1 Or SS=1 Or TT=1 Then
         TRIPOUT=1
         GoSub TRIPSURE
         Else
         TRIPOUT=0
         EndIf
         Return
         
               
         R_AKIM:         
         
         If AKIMSET<RHAM  Then
         GoSub TRIPSURE
         If AKIMSET<RHAM  Then
         RLED=1
         RR  =1
         EndIf
         Else
         RLED=0
         RR  =0
         EndIf
         Return
         
         S_AKIM:   
               
         If AKIMSET<SHAM  Then
         GoSub TRIPSURE
         If AKIMSET<SHAM  Then
         SLED=1
         SS  =1
         EndIf
         Else
         SLED=0
         SS  =0
         EndIf
         Return
         
         T_AKIM:
                 
         If AKIMSET<THAM  Then
         GoSub TRIPSURE
         If AKIMSET<THAM  Then
         TLED=1
         TT  =1
         EndIf
         Else
         TLED=0
         TT  =0
         EndIf
         Return
                       
         TRIPSURE:
         For G=0 To DELAY
         DelayUS 1
         Next
         Return
         
         ZAMAN:
         For H=0 To 250
         DelayUS 1
         Next
         Return
         
         TEST:
         If TRIPBUTONU=1 And TRIPOUT=0 Then
         GoSub ZAMAN
         While TRIPBUTONU=1
         TRIPOUT=1
         GoSub ZAMAN
         GoSub ZAMAN
         GoSub ZAMAN
         Wend
         TRIPOUT=0
         EndIf
         Return             
         
         Disable           
         KESME:
                   
         GIE=0
         TR=AKIMSET * 25/10
         
              If T0IF=1 Then           
         TOP_R=0
         For R=0 To 29     
         RHAM   =ADIn 2
         TOP_R=TOP_R+(RHAM+1)
         Next
         RHAM=TOP_R/30
         If TR<RHAM Then
         TRIPOUT=1
         RLED=1         
         EndIf
         
         TOP_S=0
         For S=0 To 29     
         SHAM   =ADIn 1
         TOP_S=TOP_S+(SHAM+1)
         Next
         SHAM=TOP_S/30
         If TR<SHAM Then
         TRIPOUT=1
         SLED=1         
         EndIf
         
         TOP_T=0
         For T=0 To 29     
         THAM   =ADIn 0
         TOP_T=TOP_T+(THAM+1)
         Next
         THAM=TOP_T/30
         If TR<THAM Then
         TRIPOUT=1
         TLED=1         
         EndIf   
              EndIf
                                             
         GIE=1
         T0IF=0
         Resume
         Enable
       
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

#14
Program yerine hex dosyası ile DSN dosyasını  koysan daha iyi olurdu. Program Proton ile yazılmış. Derleyici bende kurulu değil.
Ayrıca programın baş kısmına bir bakarmısın?
If FF=0 Then       
RLED=1
GoSub ZAMAN
RLED=0
SLED=1
GoSub ZAMAN
SLED=0
TLED=1
GoSub ZAMAN
TLED=0
FF=1
EndIf

Bu kodlar nedeni ile ilk açılışta FF=0 olacağı için bahsini ettiğin çıkışlar birer birer aktif olacaklar zaten senin sorunun bu olmasın ?
Ete

Powered by EzPortal