Kesme ve lcd kullanım sorunu

Başlatan torlaktr, 12 Mart 2013, 22:39:11

torlaktr

Arkadaşlar merhaba
Programda lcd ye komut gönderdıgım zaman kesme kayıyor sapıtıyor daha doğrusu bu neden olur ?

TRISB=%00000001   'PortB.0 giriş diğerleri çıkış yapıldı.
TRISC=%00000000   'A portu tamamı çıkış yapıldı.
TRISD=%00000000
'-----------------------------------------------------------------
portb.0 = 1
portc.4 = 0


DEFINE LCD_DREG PORTD 'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG PORTD 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 3 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG PORTD 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 2 'LCD RS bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor
DEFINE ADC_CLOCK 3

'-----------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%00000101   'dahili Pull up dirençleri aktif edildi ayrıca pullup direncine gerek yok.
INTCON=%10010000  'Kesmeler aktif ve RB0/INT kesmesi aktif
ADCON1=%10000010 '7. bit 1 yapıldı 10 bit sonuç almak için.
OPTION_REG.6=1  'portB deki dahili PULL-UP lar iptal edildi.
'-----------------------------------------------------------------

'----------------------A---------------------------------------------

BASLA: 'Ana program bölümünde program bir şey yapmayacak
   
LCDOUT $FE,2,   " DENEMEE"
PAUSEUS 200



   goto basla
   
     
     
   
DISABLE  'yeniden kesme oluşması önleniyor 

KESME: 'program buraya geldiğinde kesme oluşmuş demektir.


if intcon.1 = 1 then goto kesme_frekans
if intcon.2 = 1 then goto kesmezaman
     

   
   
   
kesmezaman

    intcon.2 = 0 
    intcon.5 = 0
    portc.4  = 1
 
    resume
       
   
kesme_frekans ;
     
       
       if option_reg.6 = 0 then
       option_reg.6 = 1
       else
       option_reg.6 = 0
       endif
       portc.4 = 0
       
     

       
     tmr0 = 150 ; 105 idi
       intcon.5 = 1
       intcon.2 = 0
       intcon.7 = 1
       INTCON.1=0  'RB0/INT Bayrağı (flag) silindi.
       Resume      'geldiğin yere dön.
       Enable      'kesmeler yeniden aktif.
End
                   
   

Pic_877

Hangi kesmede sorun var? b0 kesmesinde mi tmr0 kesmesinde mi? option registerini, yükselen kenar düşen kenar seçimini ve prescaler değerini kontrol edin. Programın çalışmasını anlamadığımdan fazla birşey söyleyemedim.

torlaktr

kesmede sorun yok kesme gayet ıyı calışıyor fakat lcd komutu yazdıgım zaman kesme deli gibi sağa sola kayıyor

ete

Programın başına DEFINE OSC  4.  Yada hangi frekansta çalışıyor ise o değeri yaz.
Basla satırından önce şu komutları ilave et.
Pause 150
LCDOUT $fe,1
Pause 500

Sonucu yaz.
Ete

torlaktr

ete o zaten var artı pause yazamam kesmeye geç gıder tmr kesmesi var

ete

#5
Yazdıklarımı iyi okumadığın belli oluyor. O zaten var dediğin neyse oda yok buna emin ol.
Basla satırından evvel koyulan komutlar yalnızca bir kere işlenir.
Kesmeye bu nedenle zararı olmaz. Çok endişeleniyorsan kesmeyi aktif etme komutlarını son pauseden sonra verirsin.
Programına açılış gecikmesi vermemişsin. Özellikle lcd 150 - 200 ms lik bir süre ister. Bu kendi registerlerini yerleştirmek için gereklidir. Üstelik lcd nin açılışını yapabilmen için verdiğim satırların programda olması gerekir. Program senin ister yaprsın ister yapmazsın.
Ete

torlaktr

Hayır onu demek istemedım yanlış anladın
Demek istediğim şu idi programın kendısınde var buraya yazmayı unutmuşum onu söylemek ıstedım
peki deniyorum hemen tekrardan.

torlaktr

Ete hocam öncelikle cevap için teşekkür ederim fakat dediğinizi yaptım kesmem sürekli sağa sola çılgın gıbı gıdıp gelıyor program kodlarını yazıyorum ıstersenız isis oalrakta atabılırım yardımcı olursanız çok sevınırım yazdıgım gunden berı uğraşıyorum denemedıgım yöntem kalmadı olmuyor ve çıldırmak üzereyim

'****************************************************************
'*  Name    : KESME-RB0.BAS                                      *
'*  Author  : [Erol Tahir Erdal]                                *
'*  Notice  : Copyright (c) 2005 [ETE]                          *
'*          : All Rights Reserved                               *
'*  Date    : 23.04.2005                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

TRISB=%00000001   'PortB.0 giriş diğerleri çıkış yapıldı.
TRISC=%00000000   'A portu tamamı çıkış yapıldı.
TRISD=%00000000
TRISA=%00000001
'-----------------------------------------------------------------
portb.0 = 1
portc.4 = 0
portc.0 = 1
portc.1 = 1



DEFINE LCD_DREG PORTD 'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG PORTD 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 3 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG PORTD 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 2 'LCD RS bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor
DEFINE ADC_CLOCK 3
DEFINE ADC_BITS 10     'A/D çevirim sonucu kaç bit olacak
DEFINE ADC_SAMPLEUS 100 'Örnekleme zamanı mikro saniye cinsinden.


'-----------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%00000101   'dahili Pull up dirençleri aktif edildi ayrıca pullup direncine gerek yok.
INTCON=%10010000  'Kesmeler aktif ve RB0/INT kesmesi aktif
ADCON1=%10001110
OPTION_REG.6=1  'portB deki dahili PULL-UP lar iptal edildi.
'-----------------------------------------------------------------

'----------------------A---------------------------------------------



BASLA: 'Ana program bölümünde program bir şey yapmayacak

pauseus 100
lcdout $FE,1,"DENEMEEEE"
goto basla
 


   
DISABLE  'yeniden kesme oluşması önleniyor 
KESME: 'program buraya geldiğinde kesme oluşmuş demektir.

if intcon.1 = 1 then goto kesme_frekans
if intcon.2 = 1 then goto kesmezaman


   
   
kesmezaman
    intcon.2 = 0 
    intcon.5 = 0
    portc.4  = 1
   
    resume
       
   
kesme_frekans ; 
       if option_reg.6 = 0 then
       option_reg.6 = 1
       else
       option_reg.6 = 0
       endif
       portc.4 = 0
     
     
   
     
     tmr0 = 200; 105 idi
     
   

       intcon.5 = 1 
       intcon.2 = 0
       intcon.7 = 1
       INTCON.1=0  'RB0/INT Bayrağı (flag) silindi. 
       Resume      'geldiğin yere dön.
   Enable      'kesmeler yeniden aktif.
End
               
   

ete

Sen dosyaları paketle bana yolla. Şu anda bakacak durumda değilim uygun olunca bakacağım.
Ete

torlaktr

nasıl yollayayım maıl varmı ete hocam ona göndereyım

torlaktr

#10
ete hocam buradan ındırebılırsınız upload ettım
Burada ben adc ile lcd ye herhangi bir veriyi basmak ıstıyorum porta.0 da pot bağlı zaten bilginiz olsun.

http://www.yukletr.com/download.php?file=b62a09fb28a30f0ba08d00547e766bc9

Şimdiden çok teşekkür ederim 2 hafta boyunca uğraştım valla yaparsan çok makbule geçer
tekrar teşekkürler

ete

#11
Bak bakalım doğru çalışıyormudur.
Ete

torlaktr

Ete hocam gayet güzel calışıyor allah razı olsun valla bu mılletın dua sı yeter sana ama gönlümden koptu
biz tristör, diyot, trafo ve varyak işi ile uğraşıyoruz bu tur bı ıhtıyacın varsa söyle gönlümden koptu sana göndereceğim güç fark etmez bu tur bı elemana ıhtıyacın varsa pazartesı hemen göndereyim sana ıkı hafta uğraştım bu işle cunkı
Çok teşekkür ederim

torlaktr

Ete hocam tekrardan merhaba
Hocam bu kesme içerisinde ben adc ölçtürüp lcd ye basmak ıstıyorum fakat olmuyor bu sefer tmr0 kesmem etkilenıyor buna nasıl bir çözüm bulabılırım


ete

Kesme çok özel bir durumdur işlemci için. Bütün her işini bırakıp kesme içine girince elinde değeri olan ne kdar değişken varsa bir yerlere kayıt eder. Ayrıldığı adreside kayıt eder. Kesmeden çıkar çıkmaz bu kayıt ettiklerini geri yükler. Ayrıldığı adreside alıp kaldığı yere döner. Sen kesme içinde başka işler yapmaya kalkarsan bazı değerler kaybolur ve işlemci şaşırabilir.
Kesme oluşturduğumuz zaman bir nolu kural mümkün olan en kısa sürede kısmeden çıkmaktır. O halde yapılması gerekenleri kesme içinde değil kesmeden çıkar çıkmaz yapmak gerekir. Ama yapıp yapmayacağıma nasıl karar vereceğim. Tabiiki bayrak kullanarak. Kesme içine AD=1 dersek ve ana çalışma kısmında;
If AD=1 then
  Ad=0
   Gosub adcal
    Lcdout .........
Endif şeklinde yaparsan sorun çözülmüş olacaktır.
Ete

Powered by EzPortal