Merhaba arkadaslar
Protonda graofik lcd ile calisirken kesme ile ilgili bir sorun cikiyor. Programin biryerinde bir tablo olusturmusum. Tabloyu olustururken bir cok line komutu kullaniyorum tabloyu bu line komutlari ile yaptim. Programin bazi yerinde tmr0 kesmesi ni kullanmam gerekiyor . Kesmeler kapali iken kendi olusturdugum tablo sorunsuz calisiyor. Kesmeyi actigim zaman tablo yine cikiyor ama bir sure sonra goruntu bozulmaya basliyor
Sanirim line komutlari islenirken kesme geldigi zaman komutlar duzgun calismiyor.
Programda sadece bazi bolumlerde kesme kullanmam gerekiyor. Bu yuzden sadece lazim oldugunda kesmeleri acip ihtiyac olmadigindada kesmeleri kapatmak istiyorum. Simdi program islerken kesmeyi kapatiyorum. Fakat kesmeleri tekrar aktif ettigimde kesme tekrar calismiyor. Kullandigim islemci 18F4620 20 mhz de calistiiriyorum. Amacim sadece gerektiginde kesmeyi aktif etmek. Acaba neden kesme tekrardan calismiyor. Neyapmam gerekiyor.
(Cep telefonu ile yazdigim icin turkce
karakterler nedense cikmiyor. Bu seferlik
mazur gorun)
intcon.7 bitini temizlerseniz(0) tüm kesmeler iptal olur. Tekrar aktif hale getirmek için de set edersiniz.
Peki öncelikli interrupt olayını kullanıyormusunuz? RCON registerinin 7. bitini 1 yapınca öncelikli kesme açılmış oluyor, 0 yapılırsa 16f lerdeki gibi oluyor.
Eğer RCON,7=0 ise, yani öncelikli interrupt olayı kapalı ise:
INTCON ' un 7. biti ile tüm kesmeleri açıp kapatabilirsiniz.
Eğer RCON,7=1 ise, yani öncelikli interrupt özelliği açık ise:
INTCON ' un 7. biti yüksek öncelikli kesmeleri açıp kapatır.
INTCON ' un 6. biti düşük öncelikli kesmeleri açıp kapatır.
Rcon.7 ne durumda olursa olsun intcon.7 temizlendiğinde tüm kesmeler iptal olur.
Alıntı YapRcon.7 ne durumda olursa olsun intcon.7 temizlendiğinde tüm kesmeler iptal olur.
(http://s3.postimg.cc/1tzn23nt0/nterrupt.jpg) (http://postimg.cc/image/1tzn23nt0/)
PIC18F4620 Datasheet Sayfa 111
Alıntı yapılan: Hasan Oguz - 24 Temmuz 2011, 20:53:49
Alıntı YapRcon.7 ne durumda olursa olsun intcon.7 temizlendiğinde tüm kesmeler iptal olur.
(http://s3.postimg.cc/1tzn23nt0/nterrupt.jpg) (http://postimg.cc/image/1tzn23nt0/)
PIC18F4620 Datasheet Sayfa 111
@hasan oğuz, aynı datasheetten bende de var :)
bit 7 GIE/GIEH: Global Interrupt Enable bit
when IPEN= 0 // Ipen 0 iken
1 = Enables all unmasked interrupts
0 = Disables all interrupts // tüm kesmeleri engeller
When IPEN = 1: // Ipen 1 iken
1 = Enables all high-priority interrupts
0 = Disables all interrupts // tüm kesmeleri engeller
Siz ne tür kesmeler set etmiş olursanız olun, gie/gieh bitini temizlediğinizde, bunların hiçbiri gerçekleşemez!
Bunu görsel olarak takip etmek için lojik şemaya da bakabilirsiniz.
Orada göreceğiniz gibi her iki kesme vektörünü gösteren and kapılarından her ikisinde de gie/gieh biti girişe bağlıdır ve 0 olursa her iki tür kesme de gerçekleşemez.
(http://img850.imageshack.us/img850/9537/unled1ov.gif)
Eğer RCON,7=0 ise, yani öncelikli interrupt olayı kapalı ise:
INTCON ' un 7. biti ile tüm kesmeleri açıp kapatabilirsiniz.
Eğer RCON,7=1 ise, yani öncelikli interrupt özelliği açık ise:
INTCON ' un 7. biti 1 olursa yüksek öncelikli kesmeler açık, 0 olursa tüm kesmeler kapalı.
INTCON ' un 6. biti düşük öncelikli kesmeleri açıp kapatır.
tyildizak arkadaşım gerçekten çok teşekkürler, kaçırdığım o ufak ayrıntıyı bana göstermiş oldunuz, o zaman yukarıdaki gibi düzenleyebiliriz.
Rica ederim, ek olarak, tüm kesmeleri gie biti ile engelleyip, sonradan biti set ederek kesmeleri tekrar aktif ettiğinizde de, arada geçen sürede herhangi bir kesme oluşup ilgili kesme bayrağını set etmiş olabilir.
Gie biti ile tüm kesmeleri aktif hale getirmeden önce bunları da temizlemek gerekecektir.
Alıntı Yaptüm kesmeleri gie biti ile engelleyip, sonradan biti set ederek kesmeleri tekrar aktif ettiğinizde de, arada geçen sürede herhangi bir kesme oluşup ilgili kesme bayrağını set etmiş olabilir.
Gie biti ile tüm kesmeleri aktif hale getirmeden önce bunları da temizlemek gerekecektir.
tyildizak arkadaşım gerçekten önemli bir noktayı vurgulamışsın.
Mucit23 arkadaşımız anlattığına göre sadece TMR0 kesmesini kullanıyormuş, o zaman onun sadece TMR0 kesme bayrağını (TMR0IF) temizlemesi yeterli.
enable ve disable ı da bir araştırınız
Kesme bitleriyle aynı sorunu ben de yaşamıştım. Aslında bu durum bana mantıksız geliyor ama yapacak birşey yok gibi, adamlar öyle tasarlamış. Bu başlığı (https://www.picproje.org/index.php/topic,33732.0.html) bir inceleyin.
asrkadaşlar cevaplarınız için teşekkür ederim. Şimdi sorunu çözdüm. Dediğiniz gibi Kesmeyi tekrar aktif etmeden önce Kesme bayrağını Ve TMR0L sayacını temizlemek gerekiyormuş.
Boş zamanlarımda program yazmak dışında yürütmekte olduğum projelerde kullandığım işlemcilerin datasheedini açıp incelerim. Kesmede birçok şeyi öğrendimde Bu öncelikli kesme işini anlayamadım. Pic hangi durumlarda neye göre kesmelere öncelik tanıyor.
Bunun yanı sıra öğrenmek istediğim bir konu daha var. Diyelim biz hem tmr0 kesmesi hemde RB0 kesmesini aynı anda kullanmak istiyorum. Veya birden fazla kesmeyi aynı anda kullanmak istiyorum. Bunun için her kesme çeşidi için ayrı ayrı kesme alt programları olmuyor herhalde. Tek bir alt program yapıp sadece kesme bayrakları ile kesmenin nereden geldiğinemi bakmak gerekiyor?
Alıntı YapKesmede birçok şeyi öğrendimde Bu öncelikli kesme işini anlayamadım. Pic hangi durumlarda neye göre kesmelere öncelik tanıyor.
Öncelik tanınacak kesmeleri sen ayarlayacaksın. INTCON2, INTCON3, IPR1, IPR2 registerlerinden bu ayarlanabiliyor.
Alıntı Yapbirden fazla kesmeyi aynı anda kullanmak istiyorum. Bunun için her kesme çeşidi için ayrı ayrı kesme alt programları olmuyor herhalde. Tek bir alt program yapıp sadece kesme bayrakları ile kesmenin nereden geldiğinemi bakmak gerekiyor?
Evet her kesme çeşidi için ayrı ayrı alt programlar olmuyor, düşük öncelikli interrupt geldiğinde 0x18, yüksek öncelikli interrupt geldiğinde 0x08 adresine gider PIC, bu sabittir. Aynen dediğiniz gibi olacak; kesme bayrakları ile hangi kesmenin geldiğine bakacaksınız. Daha ayrıntılı bilgi için datasheeti incelemenizi öneririm, orada ayrıntılı bir şekilde anlatılmış.
Çok teşekkür ederim Aynen tahmin ettiğim gibiymiş. 18F4620 çok hoşuma gitti. Datasheedini incelerken kendimi kaybediyorum. Herkese teşekkür ederim
Alıntı yapılan: Mucit23 - 25 Temmuz 2011, 16:12:34
Çok teşekkür ederim Aynen tahmin ettiğim gibiymiş. 18F4620 çok hoşuma gitti. Datasheedini incelerken kendimi kaybediyorum. Herkese teşekkür ederim
Arkadaşım dediğine katılıyorum; 18F4620 gerçekten de PIC18 ailesinin en iyi mikrodenetleyicilerinden biri, en göze çarpan özelliği de belleklerin geniş kapasiteli olması:
FLASH PROGRAM MEMORY : 64 KB
RAM : 3968 B (doldur doldurabilirsen) 8)
EEPROM : 1024 B
Ben de yukarıda saydıklarımın yanında diğer birçok özellikleriyle 18F4620 ' yi tercih ediyorum.
En sevdiğim PIC18 modeli. :)
Arkadaşlar sorunu kısmende olsa çözdüm ama anladımki sorun daha farklı bir boyutta. Şöyleki kesmeyle ilgili bir sorunum kalmadı çok şükür. İstediğim yerde kesmyi açıp kapayabiliyorum. Fakat kesme açık olduğu zaman ve program grafik lcdye veriler gönderilen bir döngü içerisine girdiği zaman grafik lcddeki görüntü pixel pixel silinmeye başlıyor. Kesme kapalı olduğu zaman herhangi bir sorun olmuyor. Protonda Hardware kesmesi kullanıyorum. TMR0 bölücü oranı 1/64, Kesme alt programında ise sadece bir sayacı saydırıyorum. Acaba sorun neyle ilgili olabilir.
Arkadaşlar bu konuda kimsenin bi fikri yokmu? Neden böyle bir sorun yaşıyorum. Bilgilerinize ihtiyacım var...
Arkadaşlar forumda pek fazla kimse yok galiba konuyu yine güncel tutmak istiyorum çünkü hala sorunu çözebilmiş değilim. Yardımlarınıza ihtiyacım var
Arkadaşlar konuyla ilgili kimsenin pek fazla bilgisi yok galiba. Bu konuda farklı çıkış yolları aramaya başladım. Yani farklı kesmelerdede aynı sorun oluyormu ona bakayım. Umarım konuyla ilgili tecrübe yaşayan birilerine rastlarım
Sorun sıradan bir sorun değil. Kesmeye girdiğinde saçma sapan şeyler yapıyor olsa , mantıklı bir açıklama bulmak daha kolay olurdu. Ama kesme açıkken piksellerin tek tek silinmesi , belirli bir düzen olduğunun göstergesi. Kodu görmeden birşey söylemek pek mümkün değil.
Aklıma gelen tek ihtimak stack şişmesi. Belki kesme hizmet rutinine gidince yığına bir değer atılıyor , bu değer önceki bir değerin üzerine yazılıyor, sonrada kesmeden döndükten sonra bu hatalı değer ığından çekiliyor olabilir.
Ama yığında taşma varsa bunu derleyicinin bildirmesi gerekirdi.
Eğer lcd yazma için bir fonksiyon çağırıyorsan , bu fonksiyon içindeki kodları ana döngüye alarak , sorunun yığın taşmasından kaynaklanıp kaynaklanmadığını test edebilirsin.
protonda hardware kesmede bu tip bir sorun yaşadım.kodu görmeden bir çözüm karanlık odada iğne aramak gibi bir şey.
context save ve context restore komutlarını kullanıyor musunuz bilmiyorum ama kullanmıyorsanız bu komutları kullanın
hocam ilginiz için teşekkür ederim. Dediklerinize göre bazı denemeler yaptım. Programda ekrana yazı yazılan kısım alt program halindeydi. Sizin dediğiniz gibi bu alt programdaki kod parçacıklarını ana döngüye taşıdım. Buna rağmen değişen birşey olmadı. Daha önce ekran pixel pixel siliniyor dedim ama öyle değil aslında. Ekranı 8 satır 128 sütun olarak düşünürsek rastgele bir satırdan herhangi bir sütun komple siniyor. Ama hemen ardından program silinen yeri yeniliyor sadece benim grafik lcd de benim herhangi bir işlem yapmadığım yerler silinip kalıyor. Bunu yeni anladım. Hocam şimdi ceptelefonu ile girmişim internete bugün değil ama yarın sorunu ençok gördüğüm yerden bir kod parçacıgı paylaşacagım. Orada herşey belli olur herhalde. Feritt hocam yaşadığınız sorunla ilgili biraz ayrıntı verebilirmisiniz? Sizdedemi ekrandaki veriler siliniyor. Cynetron hocam hocam kesme alt programında dediğiniz komutları kullanıyorum zaten.
muhittin kaplan hocamın yazılarına göz atmak lazım."Hardware kesmesinde ise, kesme altprogramına girer girmez sistemi etkileyen kayıtcı durumlarının yedeklenmesi ve kesmeden çıkarken bunların tekrardan yüklenmesi gerekir. Yedekleme işlemini Context Save, geri alma işlemini Context Restore komutları yapar. Hardware Kesmesi için intcon kayıtcısının ayarlanması için yapılması gereken önemli hususlardan biri de Ayar yapmaya başlamadan önce Global Int bayrağının "0" yapılması gerekliliğidir. Ayrıca kesme altprogramı içerisinde mümkün olan en kısa zamanda çıkılması gerekir. Diğer uzun beklemelerde ana program çalışmayabilir."
bende ki sorun global int bayrağı ile ilgili idi.sistem kesmeye giriyor canı isterse çıkıyor istemezse çıkmıyordu.kesme içine bir sayaç koyup kesmenin sürekli oluştuğunu takip edebilirsin.
ayrıca muhittin hocaya bu faydalı eser için tekrar teşekkür ediyorum. ;D
Bende zaten muhittin hocamızın kitabından yararlanarak kesme ayarlarını yapmıştım. Kitapta geçenlerin hepsini uygulamısim. Zaten kesmenin çalışmasında ben bir sorun göremiyorum.
Arkadaşlar sorunu en çok gördüğüm yerden bir parça programcık ekleyeyim. Burada ufak bi menü yapmıştım. Bu şekilde bir menü çok daha iyi yapılabilir. Fazla düşünmedim zaten üzerinde. Simülasyonda denerseniz çokdaha iyi anlarsınız ne denli bir sorun olduğunu.
En çok burada kendini belli ediyor.
Device 18F4620
Config_Start
OSC = HS ; HS
FCMEN = OFF ; Disabled
IESO = OFF ; Disabled
PWRT = OFF ; Disabled
BOREN = OFF ; Disabled
WDT = OFF ; Disabled
MCLRE = On ; Enabled
LPT1OSC = OFF ; Disabled
PBADEN = OFF ; PORTB<4:0> digital on Reset
STVREN = OFF ; Disabled
LVP = OFF ; Disabled
XINST = OFF ; Disabled
Debug = OFF ; Disabled
Config_End
Xtal 20
TRISA=%00000011
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000
PORTA=0:PORTB=0
PORTC=0:PORTD=0
PORTE=0
All_Digital=TRUE
PortB_Pullups= OFF
CMCON=7
INTCON.7=0
INTCON=%00100000
T0CON=%11000101
TMR0L=0
On_Hardware_Interrupt GoTo KESME
INTCON.7=1
LCD_DTPort = PORTB 'GLCD DATA PORTLARI PORTB'YE BAĞLI
LCD_RSPin = PORTD.4 'GLCD RS PİNİ PORTC.5 BAĞLI
LCD_ENPin = PORTD.2 'GLCD ENABLE PİNİ PORTC.1 BAĞLI
LCD_RWPin = PORTD.3 'GLCD RW PİNİ PORTC.4 BAĞLI
LCD_CS1Pin = PORTD.0 'GLCD CS1 PİNİ PORTC.2 BAĞLI
LCD_CS2Pin = PORTD.1 'GLCD CS2 PİNİ PORTC.3 BAĞLI
LCD_Type = Samsung 'GLCD TİPİ GRAFİK KS0108 128*64B WİNSTAR
Internal_Font = On
Font_Addr = 0
Declare GLCD_STROBE_DELAY = 5
Declare Shift_DelayUs 10
GLCD_EXTERNAL_PRINT = PPRINT
Dim Xpos As Byte
Dim Ypos As Byte
Dim GINV As Byte
Dim SAYAC1 As Byte
Dim SETCLEAR As Byte
Dim addr As Word
DelayMS 100
Cls
Print Font Arial____6o75
SETCLEAR=1
Line SETCLEAR,39,2,100,2
Line SETCLEAR,39,52,100,52
Line SETCLEAR,39,2,39,52
Line SETCLEAR,100,2,100,52
SETCLEAR=0
For Ypos=3 To 11
Line SETCLEAR,40,Ypos,99,Ypos
Next Ypos
Print At 4,41,Inverse 0,"SEcENEKLER"
SETCLEAR=1
Line SETCLEAR,40,12,99,12
SETCLEAR=0
For Ypos=13 To 21
Line SETCLEAR,40,Ypos,99,Ypos
Next Ypos
Line 1,40,13,99,13
Line 1,40,14,40,21
For Ypos=14 To 21
Line 1,82,Ypos,99,Ypos
Next
Print At 14,41,Inverse 1,"DdZENLE"
SETCLEAR=1
Line SETCLEAR,40,22,99,22
SETCLEAR=0
For Ypos=23 To 31
Line SETCLEAR,40,Ypos,99,Ypos
Next Ypos
Print At 24,41,Inverse 0,"PRG.bAc"
SETCLEAR=1
Line SETCLEAR,40,32,99,32
SETCLEAR=0
For Ypos=33 To 41
Line SETCLEAR,40,Ypos,99,Ypos
Next Ypos
Print At 34,41,"PRG.bSiL"
SETCLEAR=1
Line SETCLEAR,40,42,99,42
SETCLEAR=0
For Ypos=43 To 51
Line SETCLEAR,40,Ypos,99,Ypos
Next Ypos
Print At 44,41,"iPTAL"
SETCLEAR=1
Line SETCLEAR,40,52,99,52
GINV=2
BASLA:
If PORTA.0=0 Then
DelayMS 50
GINV=GINV*2
If GINV>16 Then GINV=16
While PORTA.0=0:Wend
EndIf
If PORTA.1=0 Then
DelayMS 50
GINV=GINV/2
If GINV=1 Then GINV=2
While PORTA.0=0:Wend
EndIf
GoSub EKRAN
GoTo BASLA
EKRAN:
Line GINV.1,40,13,99,13
Line GINV.1,40,14,40,21
For Ypos=14 To 21
Line GINV.1,82,Ypos,99,Ypos
Next
Print At 14,41,Inverse GINV.1,"DdZENLE"
Line GINV.2,40,23,99,23
Line GINV.2,40,24,40,31
For Ypos=24 To 31
Line GINV.2,78,Ypos,99,Ypos
Next
Print At 24,41,Inverse GINV.2,"PRG.bAc"
Line GINV.3,40,33,99,33
Line GINV.3,40,34,40,41
For Ypos=34 To 41
Line GINV.3,83,Ypos,99,Ypos
Next
Print At 34,41,Inverse GINV.3,"PRG.bSiL"
Line GINV.4,40,43,99,43
Line GINV.4,40,44,40,51
For Ypos=44 To 51
Line GINV.4,69,Ypos,99,Ypos
Next
Print At 44,41,Inverse GINV.4,"iPTAL"
Return
KESME:
Context Save
Inc SAYAC1
If SAYAC1>150 Then SAYAC1=0
If SAYAC1>74 Then
High PORTC.7
Else
Low PORTC.7
EndIf
INTCON.2=0
TMR0L=10
Context Restore
End
Include "ARIAL_S_7.txt"
font dosyasını kendim düzenlediğim için programda türkçe karakterlerin yerinde başka karakterler görebilirsiniz.
Umarım sorunu çözebiliriz.
Diğer dosyaları Buradan (http://hotfile.com/dl/126211178/e782719/kesme_deneme.rar.html) indirebilirsiniz..
Kesme kısmını ifade ederken yanlışlık var gibi. Bence buna benzer yapman gerek:
On_Hardware_Interrupt Goto Flash
' Assign some Interrupt associated aliases
'Symbol vs..
'Bence buraya başka kod yazılmaz.
' YAZILACAK TEK KOD kesme rutini öncesi ana etikete yönlendirME KODUDUR..
Goto Over_interrupt
Flash:
....
Context Restore ' Restore the registers and exit the interrupt
Over_interrupt :
...
goto Over_interrupt
Ayrıca kesmenin içinde yapılacak ilk iş kesme flagini sıfırlamak olsa iyi olur
Yanlış anlamadıysam kesme alt programı ana ve alt programlardan öncemi yazılması gerekir.
On_Hardware_Interrupt Goto Flash
' Assign some Interrupt associated aliases
'Symbol vs..
'Bence buraya başka kod yazılmaz.
' YAZILACAK TEK KOD kesme rutini öncesi ana etikete yönlendirME KODUDUR..
Goto Over_interrupt
Bu iki kırmızı satır arasına kod yazılmaz diye biliyorum. 'Symbol vs.. yazılabilir.
kesme alt programınn sona veya başa yakın olması önemli olmasa gerek. fakat Goto Over_interrupt satırını mutlaka On_Hardware_Interrupt dan hemen sonra eklemeliyiz
Anladım dediklerinizi. Akşam üzerini yazdıklarınızı anladığım kadarıyla bi deniyeyim. Birde şu gözüme çarptı. Timer0 bölücü oranını arttırdığımız zaman sorun daha az olmaya başladı. Yani bölme oranını 1/256 yaptığımda çokdaha az oluyor. Kapatırsam hiç olmuyor zaten. Acaba siz denediğinizde sizdedemi aynı sorun oluyor.
Benim deneme imkanım yok.
kesme içine hiç kod yazmadan deneyelim.
sadece flag sıfırlansın
fakat kesme yine çalışsın.
bu şekilde de sorun çıkıyor mu?
eğer çıkmıyorsa muhtemelen kesmede kullanılan değişkenler bu soruna yol açmış olabilir. adım adım deneyerek sorunlu kısım bulunabilir. Mantıklı açıklaması olmasa da yine sorun çıkabilir. Sadece sorun çıkan yeri bulup kaldırmak, etrafını dolanmak gerek.
Anladım hocam. Bu dediklerinizin hepsini akşam deniyeceğim. Gerçektende çok anlamsız bir sorun. Mantıklı bir açıklama bulamıyorum.
Merhabalar T2 hocam
Hocam dediklerinizin hepsini uyguladım. Teker teker uyguladım. Faklı yöntemler denedim ama sonuç değişmiyor. Acaba protonla alakalı birşey olabilirmi. Anlamıyorum birtürlü. Aslında yukarıdaki örnekte kesmeye ihtiyacım yok. Zaten gerçekte bu kısımlarda kesmeyi kapatıyorum.
En çok burada kendini belli ediyor. Ana dönbgüde bu kadar olmasada az da olsa yapıyor.
Başka önerisi olan arkadaşlar varsa her türlü önerilere açığım.
Arkadaşlar merak ediyorum sadece bendemi böyle bir sorun oluyor diye. Sizden ricam deneme şansı olan arkadaşlar programı derleyip denerlerse sevinirim. Birde ben hardware interrupt yerine normal interrupt kullanmayı denediğimde sonuç dahada kötüleşti.
Bu sorunu basit bir yöntem ile kendi çapımda çözdüm. Şöyleki ekrana verilerin gönderildiği bölümü tek bir alt program haline getirip. Bu alt programa gidildiğinde kesmeyi kapatıp çıkarkten tekrar açıyorum. Bu şekilde görüntü bozulmadı. Ama nekadar sağlıklı bilmiyorum. Program çalıştığı sürece devamlı kesme açılıp kapanacak. İlerde bir sorun yaratırmı bilmiyorum. Biraz endişeliyim bu konuda.