Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

16f688 de usart kesmede sorun

Başlatan med, 03 Nisan 2012, 16:55:52

med

  merhaba
  Uzun bir süre 16F688 de usart kesme ile uğraştım. Fakat alıcı ya almıyor ya da istikrarsız alıyor. Çoğu zaman saçmalıyor.
  Devrede 4 MHz iç osılatorü seçtim. Dış osilator kullanmamam bunun nedeni olabilir mi.

  Alıcı usart ayarlarında bir sorun görünmüyor.

  Alıcı ayarları
Device=16F688
Config  MCLRE_OFF,WDT_OFF,PWRTE_ON,BOD_OFF,CPD_OFF, CP_OFF ,INTRC_OSC_NOCLKOUT

Xtal 4
OSCCON=%01100101

Declare All_Digital true
Declare Hserial_Baud=9600   'MAXIBOOST
Declare Hserial_RCSTA=%10010000  'MAXIBOOST
Declare Hserial_TXSTA=%00100100  'MAXIBOOST
Declare Hserial_Clear=On    'MAXIBOOST
Declare Hserial_SPBRG=25   'MAXIBOOST

           
               
Symbol GIE  =INTCON.7   'genel interruptlarý açýyor
Symbol PEIE =INTCON.6   'peripheralinterruptlarý açýyor

Symbol RCIE =PIE1.5     'USART Recive interrupt enable bit
Symbol RCIF =PIR1.5     'USART Receive interrupt flag bit

Symbol T0IF=INTCON.2
Symbol T0IE=INTCON.5

Symbol LED=PORTA.2



GIE=0
RCIE=1
PEIE=1
GIE=1
T0IE=0
OPTION_REG=%10000101
CMCON0=7           ' komparatör pinleri iptal hepsi giriþ çýkýþ
ADCON0=0
ADCON1=0
ANSEL=0

TRISC=%00100000
PORTC=0
TRISA =%00000000
PORTA=0


Clear
On_Hardware_Interrupt GoTo KESME  'donanimsal kesme

Önyargıları parçalamak ATOMU parçalamaktan daha zor. Einstein

ibrsel

Kesme alt programında neler yapıyorsun.Hata orada olabilir.Kesme alt programına girişte "Context Save" komutu ile kayıtçı durumları için gerekli yedeklemeleri yapıp interrupt ları pasif hale getirmelisin.(Yeni bir kesme almaması için). Kesmeden çıkarken interrupt ları tekrar açıp flag ları temizlemelisin.En sonunda "Context Restore" ile kayıtçı değerlerini geri  yüklemelisin.

med

  kesme alt programi şöyle

KESME:
Context Save 'sistem yazmaçlar? yedeklenir
GIE=0 'tüm interruptlar? kapat yani INTCON.7=0
'RCIE=0
'PEIE=0
HSerIn 1,cik,[Wait("TUR"),AL1,AL2]     
TEMP=RCREG
TEMP=0   
US=1
cik:


If T0IF=1 Then
      SAYAC=SAYAC+1         'kesme sayac?  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
      If SAYAC=61 Then         '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0               'sayaç s?f?rlan?yor
         SN=SN+1              'saniye de?eri bir art?r?l?yor
            If SN=60 Then        'saniye 60 olmu? ise 1 dakika süre geçti o halde
               SN=0              ' saniye s?f?rlan?yor
               DAK=DAK+1         ' dakika de?eri bir art?r?l?yor
               If DAK>0 And DAK=1 Then
               INTCON.5=0:High LED
               For I=0 To 20
               DelayMS 100
               Next I
               Low LED :DAK=0:SN=0:SAYAC=0
                   
               EndIf
             EndIf
      EndIf               
                               
EndIf



'RCIE=1
'PEIE=1
T0IF=0               
RCIF=0   
GIE=1      'Yani INTCON.7=1 kesmeleri açtik.
Context Restore

End

Önyargıları parçalamak ATOMU parçalamaktan daha zor. Einstein

ibrsel

Aynı kesme döngüsü içerisinde hem seri bilgi alımı yapmışsın(USART KESMESİ),hen TIMER saydırmışsın..Bence USART kesmesini öncelikli kesme olarak kullan.Timer için LOW interrupt olarak kullan..

med

 Yukarıda kesme alt programında önceliği usarta vermişim.
Timer0 ı low interrupt olarak kullanma derken tam anlamadım.
Bunu nasıl yapacağım
Cevabınızı bekliyorum
Saygılar.
Önyargıları parçalamak ATOMU parçalamaktan daha zor. Einstein

ibrsel

Aşağıda kendi programlarımda kullandığım yapıyı sadeleştirerek paylaştım.RS232 ile haberleşmelerimde bu alt yapıyı kullanıyorum ve sorun çıkmıyor.Bir incele istersen..
http://www.dosya.tc/server13/LRdFJz/USART.rar.html

med

Kullandığınız yapıyı inceledim. Anlaşılır bir sadelik var.
Ancak ben kendi progrmımı buna göre nasıl yapacağım.
Kullandığım pic 16F688. Acaba başta da sormuştum. External kristal kullanmadım. İç kristali 4MHz seçmişim. Kristal burada fark eder mi.

Low interrupt 16f688 için geçerli mi.
Ayrıca aynı kullandığım yapıyı pıcbasicde çalıştırdım. ama ilginç bir şekilde sadece 1 bölü 8 prescaler değerinde düzgün çalıştı.
Fakat protonda yukarıdaki bahsettiğim sorunlar devam ediyor.
Bilgi gönderebiliyorum. ama bazen saçmalıyor.

Saygılar.
Saygılar.
Önyargıları parçalamak ATOMU parçalamaktan daha zor. Einstein

ibrsel

USART haberleşmede dışarıdan kristal bağlamanızı öneririm. Çünkü dahili OSC birçok etkenlerden etkilenebiliyor. Buda USART haberleşmede ayarlamışl olduğunuz iletişim veri hızınızın (BAUD) yakalanamamasını sağlayabilir.Dolayısı ile verileriniz sağlıklı gönderilmez veya alınmaz.Bence Öncelikle harici bir 4MHz kristal bağlayarak devrenizi bir deneyin.Okuttuğunuz bilgiyi Herhangi bir porta bağladığınız ledlere veya LCD ye aktararak görün derim..

med

4Mhz kristal osilator kullanarak devreyi tekrar deneyeceğim.
Bu arada forumda daha önceden açılmış dahili osilator mü harici osilator mü başlıklı bir konuya baktım.
Her ne kadar 16f688 ile ilgili datasheeti tam okumamışsam da anladığım kadarıyla haberleşme devrelerinde ve TİMER lı devrelerde dış osilatör (krıstal) kullanmak gerekiyor.
Daha önceden 16F628 ile yaptığım TİMER0 kesmesi ve Usart kesmesi içeren devrelerde kristal kullanmıştım ve herhangi bir istikrarsızlık görmemiştim

Saygılar.
Önyargıları parçalamak ATOMU parçalamaktan daha zor. Einstein

med

Merhaba
Devreyi yeniden 4MHz kristal kullanarak yaptim, Ayni sorunlar devam etti,
Yani kristalli haliyle internal osilatorlu (4MHz) hali arasinda bir fark henuz goremedim.

Ayni programi pic basic pro ile yaptim. Ilginc bir sorun var.
Option registerde prescaler degerini 101 yani 1/64 secmistim. Timer0  0 iken osilator de 4MHz iken 60 cevrimde 1sn saymasi gerekiyor.
Bunu da 60 kere yaptirinca 1 dakika oluyor.
Fakat  ben bu ayarlarla programda 60 cevrim degil 480 cevrim yapinca 1sn geciyor.
Prescaler degerini degistirdim. Buna ragmen  degisen hicbirsey olmuyor. Yine 480 cevrimde 1sn geciyor
yani ben prescaler degerini 1/8 de yapsam 1/256 da yapsam , 1/64 de yapsam 1sn gecmesi icin 480 cevrim yapmam gerekiyor.

Hatta timer0 degerini 0 dan degilde mesela 224 den baslattim yine degisen birsey olmadi. yine 480 cevrimle 1sn saydi
her durumda da 4mhz osilator secilydi. Hem internal secili devrede hem de XT kristal osilatorlu devrede 4Mhz kullandim.


Nedenini bir turlu cozemedim.
Normalde prescaler veya timer0 degerini degistirince zamanin degismesi gerekiyor. ama degismiyor.
Yardimlarinizi bekliyorum
Acayip bir durum.
Saygilar.
Önyargıları parçalamak ATOMU parçalamaktan daha zor. Einstein