RBCH SORUNU

Başlatan kontiki, 18 Kasım 2017, 18:33:39

kontiki

İyi akşamlar  ve kolay gelsın ustalar
Pıc16f887 ıle kesmeleri ogrenıyorum ete hocadanın derslerınden rb0  dan denedım ısıs de test
Ettım ardından devreyi kurdum çalıstı  rbch kesmelerını denedım ısıs de calıstı ama devreyı kurunca buton basılıyken sonuyo cektıgım zaman yanıyo yanık kalmıyo yada sonuk  bekleme zamanlarını degıstırdım olmadı yardımcı olursanız sevınırım sımdıden tessekurler

-----------------------CALSIMAYAN RBCH IN KODLARI
@ DEVICE pic16F887 
@ DEVICE pic16F887, WDT_OFF 
@ DEVICE pic16F887, PWRT_OFF 
@ DEVICE pic16F887, PROTECT_OFF
@ DEVICE pic16F887, MCLR_OFF 
@ DEVICE pic16F887,  INTRC_OSC_NOCLKOUT
@ DEVICE pic16F887, BOD_OFF
@ DEVICE pic16F887, LVP_ON
ON INTERRUPT GOTO IKI
ANSEL=0     
ANSELH=0   
OPTION_REG=%11000000
INTCON=%10001000   
IOCB=%00010000
CM1CON0=0
CM2CON0=0           
TRISB=%00010000
OSCCON=%01110101
TRISA=%00000000
PORTA=0
PORTB=0
DURUM VAR BYTE   
SYMBOL LED=PORTA.0
BASLA :
DURUM=PORTB   
PAUSEUS 100       
GOTO BASLA
DISABLE   
IKI:
TOGGLE LED
PAUSE 200
DURUM=PORTB
INTCON.0=0
RESUME 
ENABLE   
END
  -----------RB0 IN KESMESI CALISAN
@ DEVICE pic16F887
@ DEVICE pic16F887, WDT_on 
@ DEVICE pic16F887, PWRT_ON 
@ DEVICE pic16F887, PROTECT_OFF
@ DEVICE pic16F887, MCLR_OFF 
@ DEVICE pic16F887,  INTRC_OSC_NOCLKOUT
ANSEL=0
ANSELH=0

OPTION_REG=%00000000
INTCON=%10010000     
WPUB=%00000001
IOCB=%00000001

TRISA=0
TRISB=%00000001
PORTB=%00000001
CM1CON0=0
CM2CON0=0

SYMBOL TUS=PORTB.0
SYMBOL LED=PORTA.0
ON INTERRUPT GoTo KESME
BASLA:
pauseus 100
goto basla
DISABLE
KESME:
TOGGLE LED
PAUSE 1
INTCON.1=0
Resume
Enable
End



KODLARINIZI KOD EKLE # BUTONU İLE EKLEYİNİZ !

devreci22

Forumda büyük harfle yazı yazmak bağırmak anlamı na geliyor . Bilgi size

kontiki

Alıntı yapılan: devreci22 - 18 Kasım 2017, 21:54:33
Forumda büyük harfle yazı yazmak bağırmak anlamı na geliyor . Bilgi size

sagolasın bılmıyordum degıstırdım

ete

PortB değişiklik kesmesi yalnızca giriş olarak ayarlanmış pinler için geçerlidir.
Kullandığın işlemcide ayrıca IOCB registeri hangi pinde bu kesmeyi kullanacağınıda seçer.
Şimdi Bu registere bakalım ne değer vermişsin.?
IOCB=%00010100
Bu bilgiye bakınca 2 ve 4 nolu bitlere karşılık gelen pinlere değişiklik kesmesi atamışsın. Peki bu pinler aynı zamanda giriş olarak ayarlanmışmı.?
TRISB=%10010000
Tris registerine bakınca alakasız pinleri giriş yaptığın görülüyor.  Ya TrisB registerini IOCB registerine uyduracak yada IOCB registerini TrisB registerine uyduracaksın. Bu şekilde çalışmaması normal.

Ete

kontiki

#4
Alıntı yapılan: ete - 19 Kasım 2017, 00:10:01
PortB değişiklik kesmesi yalnızca giriş olarak ayarlanmış pinler için geçerlidir.
Kullandığın işlemcide ayrıca IOCB registeri hangi pinde bu kesmeyi kullanacağınıda seçer.
Şimdi Bu registere bakalım ne değer vermişsin.?
IOCB=%00010100
Bu bilgiye bakınca 2 ve 4 nolu bitlere karşılık gelen pinlere değişiklik kesmesi atamışsın. Peki bu pinler aynı zamanda giriş olarak ayarlanmışmı.?
TRISB=%10010000
Tris registerine bakınca alakasız pinleri giriş yaptığın görülüyor.  Ya TrisB registerini IOCB registerine uyduracak yada IOCB registerini TrisB registerine uyduracaksın. Bu şekilde çalışmaması normal.



Ete

ıocb=%00010000
trısb=%00010000

seklınde yaptım hocam yıne ısısde calısıyo kurulan devrede calısmıyo basınca sonuyo bırakınca yanıyo

F®T

Kesme içindeki pause 200 den olmasın.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

kontiki

#6
Alıntı yapılan: F®T - 19 Kasım 2017, 23:22:51
Kesme içindeki pause 200 den olmasın.
onuda denedım ustat guc kaynagını degıstırdım kabloları degıstırdım pıc i degıstırdım
butonu degıstırdım dırenclerı degıstırdım ıcsp ıle yukluyodum normal pıckıtın uzerınden de yukledım sıgorta ayarlarını degıstırerek denedım  ıkı pıc e yıne hep aynı

kontiki

Tessekkurler buldum problemı pıckıtın uzerınden caıstırınca duzgun bır sekılde calıstı sonra bır tahta parcasıyla bastım kulandıgım guc kaynaklarınla yıne duzgun calsıtı cok tessekkurler alakanıza
bır sorum olucak yınede pıckıtın uzerınden boyle ufak led yakmak lcd calıstırmak gıbı seylerı yaparsam pıckıt zarar gorurmu acaba tessekurler sımdıden

ete

Çalışmış olabilir amaa hala bazı sorunların var.
Birincisi kasme haricindeki ana program bölümünde herhangi bri pause kullanamazsın. Yada kullanırsın ama küçük dilimler şeklinde olmalıdır.
Örneğin pause 100 şeklinde değilde 100 adet pause 1 şeklinde bir döngü ile kullanmak daha uygundur. Sebebi basit, basic , kesme oluştuğu anda işlediği komutu bitirmeden kesmeye gitmez. Pause 100 komutu işlenirken kesme emri gelse anında kesmeye geçemeyecek taaki pause 100 gecikmesi bitinceye kadar. Ama pause 1 leri işlerken en fazla 1 ms lik bekleme ile kesmeye atlayabilir. Bu arada döngü de bir basic komutudur ama döngü aralığında kesmeye gidebilir.

Diğer bir sorun ise değişiklik kesmesi port daki değişiklikleri algılayarak çalışıyor olmasıdır. Portun durumu bir şekilde hafızaya alındıktan sonra hafıaya alınan ile mevcut durum arasında bir fark olursa (bir butona basılırsa) sistem hemen kesme bayrağını kaldırır. Bu nedenle kesme içinden çıkmadan önce Port'u TEMP=PORTB şeklinde okutmak kesmenin daha sağlıklı çalışmasını sağlar.

Pickit üzerinden çalıştırmak demek ile devrenin beslemesini pickit üzerinden veriyor olduğunu varsayıyorum. Devrene daha sağlıklı bir besleme ayarlarsan daha iyi olur bence. Her şeyin bir limiti vardır. Fazla akım asılırsan pickit devren zarar görebilir.
Yalnızca bir led yakmak elbette bozmaz ama belli mi olur alışkanlık edinirsin röle led motor vs leride aynı şekilde çalıştırabilirsin.

Ete

kontiki

#9
Alıntı yapılan: ete - 20 Kasım 2017, 06:41:57
Çalışmış olabilir amaa hala bazı sorunların var.
Birincisi kasme haricindeki ana program bölümünde herhangi bri pause kullanamazsın. Yada kullanırsın ama küçük dilimler şeklinde olmalıdır.
Örneğin pause 100 şeklinde değilde 100 adet pause 1 şeklinde bir döngü ile kullanmak daha uygundur. Sebebi basit, basic , kesme oluştuğu anda işlediği komutu bitirmeden kesmeye gitmez. Pause 100 komutu işlenirken kesme emri gelse anında kesmeye geçemeyecek taaki pause 100 gecikmesi bitinceye kadar. Ama pause 1 leri işlerken en fazla 1 ms lik bekleme ile kesmeye atlayabilir. Bu arada döngü de bir basic komutudur ama döngü aralığında kesmeye gidebilir.

Diğer bir sorun ise değişiklik kesmesi port daki değişiklikleri algılayarak çalışıyor olmasıdır. Portun durumu bir şekilde hafızaya alındıktan sonra hafıaya alınan ile mevcut durum arasında bir fark olursa (bir butona basılırsa) sistem hemen kesme bayrağını kaldırır. Bu nedenle kesme içinden çıkmadan önce Port'u TEMP=PORTB şeklinde okutmak kesmenin daha sağlıklı çalışmasını sağlar.

Pickit üzerinden çalıştırmak demek ile devrenin beslemesini pickit üzerinden veriyor olduğunu varsayıyorum. Devrene daha sağlıklı bir besleme ayarlarsan daha iyi olur bence. Her şeyin bir limiti vardır. Fazla akım asılırsan pickit devren zarar görebilir.
Yalnızca bir led yakmak elbette bozmaz ama belli mi olur alışkanlık edinirsin röle led motor vs leride aynı şekilde çalıştırabilirsin.

Ete
Hocam tessekur ederim öncelikle
pickit olayını algıladım sağ olun, pauseus 100 demi uzun gelicek onu pek kavrayamadım yada başka söylediklerinizden algılayamadıgım bır sey mı var ,birde durum=portb şeklinde okuttum TEMP in başka bir görevimi var acaba
  Ayrıca sizin derslerinizden 6.ders kesmelerden lcd saat örneğini yaptım 16f887 ye uyarlıyarak burda ıcsp ile yükleme yapıyorum diye lvp_on sigortasını girdim ancak pickit
ıcsp bacakları takılıyken calısıyordu cıkartıp dısardan besleme yapınca calsımıyordu bunun üzerine deniyerek sonunda lvp_off yaparak bu işlemi düzeltim olan komutları değistirmek icin kulanılıyo anladıgım kadarıyla ıcsp yuklemesi yanı bastan silip yüklerken 
LVP sigortasının bır ıslevi yok galıba cunku off yaptığım halde yükleme yapabiliyorum ancak ya bu saat gibi bir sey kulanmak istersem ve icindekileri ICSP değistirmek istersem ne yapıcam bu sefer devre çalısmıyo

ete

Pause 100 , aslında 100ms lik bir gecikme yaratan komuttur. Bizim hayatımızda bu bir saniyenin onda biri kadar bir süreye eşdeğerdir. Ama Mikroişlemci dünyasında çok uzun bir süredir ve işlemciye kesme emri gelmiş ise 100 ms bekleyip ondan sonra kesme etiketine dallanması istenmez. Bu nedenle kesme kullanılan programlarda 5-10us den daha büyük gecikme komutları kullanmak sakıncalıdır. Ama senin işinde bunu 1ms'ye kadar çıkartabiliriz. Yinede ben olsam 100ms lik gecikme yaratmak için,
FOR Z=0 to 1000
Puaseus 5
Next
şeklinde bir gecikme alt programı kullanırdım.
Böylece işlemcinin kesmeye gitmek için olsaı bekleme süresi 5us' ye ye düşürülmş olacaktır.

Durum=PORTB de aynı işi yapar. Önemli olan PORTB o andaki durumunun bir değişkene aktarılmasıdır. Bunu TEMP=PORTB şeklinde de yapabilirsin. Burada TEMP değişkeninin özel bir durumu yoktur sadece değişken adıdır.

LVP düşük voltaj ile pic'e program yazma işlemidir. Buu PİCKIT2 veya 3 kullandığınız müddetçe OFF yapmanız gerekir. Çünki o komut açık olursa işlemci düşük voltaj (5V ) ile programlama moduna girer ve siz Pickit2 ile onu programlayamazsınız.

Ete


kontiki

Hocam çok teşşekkürk edrim sağolun 

Powered by EzPortal