ihtiyac halinde kesmeyi acma-kapama

Başlatan Mucit23, 24 Temmuz 2011, 19:38:18

Mucit23

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.

Mucit23

Arkadaşlar bu konuda kimsenin bi fikri yokmu? Neden böyle bir sorun yaşıyorum. Bilgilerinize ihtiyacım var...

Mucit23

#17
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

Mucit23

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

Klein

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.

F.T

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.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ErsinErce

context save ve context restore komutlarını kullanıyor musunuz bilmiyorum ama kullanmıyorsanız bu komutları kullanın

Mucit23

 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.

F.T

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
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Mucit23

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.

Mucit23

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 indirebilirsiniz..

t2

#26
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

Mucit23

Yanlış anlamadıysam kesme alt programı ana ve alt programlardan öncemi yazılması gerekir.

t2

#28
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

Mucit23

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.