pb4-7 change kesmes sorunu

Başlatan forumsad, 10 Temmuz 2011, 12:46:10

forumsad

arkadaşlar pb0.kesmesini aşağıdaki şekilde webden ögrendim uyguladım çalıştı tam istediğim gibi oldu

aynı uygulamada kesme olayını pb4-7 change kesmesi ile yapmak istediğimde bir türlü olmuyor yardımcı olabilirmisiniz değişikliği nasıl yapmalıyım


Symbol GIE = INTCON.7     
Symbol RBIE = INTCON.3     
Symbol RBIF = INTCON.0

değişim kesmesinde yukardaki reğister ayarlarını kullanmamız gerekiyor ama olmuyor



ÇALIŞAN PB0 KESMESİ
Device 16F877A ;ENTEGRE TANIMLAMA	
Xtal 4 ;KRISTAL FREKANSI 	
'------------------------------------------------------------------------	

TRISB=%00000001	
'Input PORTB.0           'portb.0 giriş	
TRISC=%10000000	
TRISD=%00000000
TRISE=%00000000
PORTC=0 
PORTD=0 
PORTE=0

All_Digital TRUE        '16f877 nin tüm uçları Dijital 
Symbol INTF = INTCON.1     'RB0 External Interrupt Flag 
Symbol INTE = INTCON.4     'RB0 External Interrupt Enable 
Symbol GIE = INTCON.7      'Global Interrupt Enable             
INTE=1                   'RB0 Kesmesi aktif 
GIE=1                    'Aktif Olan Tüm kesmelere Yetki ver 


'kesme ayarları------------------------------------------------------
On_Interrupt GoTo INT
OPTION_REG = %00000000    'INTERRUPT KÖSE DURUMU DÜŞEN kenar



'_________________________________________________________________________
basla: 

DelayMS 50
PORTE.0=0  

PORTD.0=1
DelayMS 500
PORTD.0=0
DelayMS 500 

PORTD.1=1
DelayMS 500
PORTD.1=0
DelayMS 500 

PORTD.2=1
DelayMS 500
PORTD.2=0
DelayMS 500

PORTD.3=1
DelayMS 500
PORTD.3=0
DelayMS 500

PORTD.4=1
DelayMS 500
PORTD.4=0
DelayMS 500

PORTD.5=1
DelayMS 500
PORTD.5=0
DelayMS 500

PORTD.6=1
DelayMS 500
PORTD.6=0
DelayMS 500

PORTD.7=1
DelayMS 500
PORTD.7=0
DelayMS 500



DelayMS 10                 'Delayms 10 
GoTo basla                 'Basla ya dön 
Disable                     'Yüm int. Kapalı
            
'__________________________________________________________________________ 
INT: 
Context Save                'kaldığı yeri sakla 

PORTE.0=1

 
         
INTF=0                      'oluGan int flag'ini temizle 
Context Restore             'tüm kyıtlı reg. tekrar yüklenip keseden çıkılıyor
Enable                      'tüm int açık 
End 



CHANGE KESMESİ İÇİN AŞAĞIDAKİ GİBİ DEĞİŞTİRDİM AMA KESMEYE GİRİYOR VE ORDA KALIYOR KESMEDEN ÇIKAMIYOR
NEY EKSİK ACABA  TEŞEKKÜRLER



ÇALIŞMAYAN PB4-7 CHANGE KESMESİ
Device 16F877A ;ENTEGRE TANIMLAMA	
Xtal 4 ;KRISTAL FREKANSI 	
'------------------------------------------------------------------------	

TRISB=%11111111	
'Input PORTB.0           'portb.0 giriş	
TRISC=%10000000	
TRISD=%00000000
TRISE=%00000000
PORTC=0 
PORTD=0 
PORTE=0

All_Digital TRUE        '16f877 nin tüm uçları Dijital 
'Symbol INTF = INTCON.1     'RB0 External Interrupt Flag 
'Symbol INTE = INTCON.4     'RB0 External Interrupt Enable 
'Symbol GIE = INTCON.7      'Global Interrupt Enable 

Symbol GIE = INTCON.7      
Symbol RBIE = INTCON.3     
Symbol RBIF = INTCON.0  
          
'INTE=1                   'RB0 Kesmesi aktif 
'GIE=1                    'Aktif Olan Tüm kesmelere Yetki ver 
GIE=1
RBIE=1


'kesme ayarları------------------------------------------------------
On_Interrupt GoTo INT
OPTION_REG = %00000000    'INTERRUPT KÖSE DURUMU DÜŞEN kenar



'_________________________________________________________________________
basla: 

DelayMS 50
PORTE.0=0  

PORTD.0=1
DelayMS 100
PORTD.0=0
DelayMS 500 

PORTD.1=1
DelayMS 100
PORTD.1=0
DelayMS 500 

PORTD.2=1
DelayMS 100
PORTD.2=0
DelayMS 100

PORTD.3=1
DelayMS 100
PORTD.3=0
DelayMS 100

PORTD.4=1
DelayMS 100
PORTD.4=0
DelayMS 100

PORTD.5=1
DelayMS 100
PORTD.5=0
DelayMS 100

PORTD.6=1
DelayMS 100
PORTD.6=0
DelayMS 100

PORTD.7=1
DelayMS 100
PORTD.7=0
DelayMS 100



DelayMS 10                 'Delayms 10 
GoTo basla                 'Basla ya dön 
Disable                     'Yüm int. Kapalı
            
'__________________________________________________________________________ 
INT: 
Context Save                'kaldığı yeri sakla 

PORTE.0=1

 
         
'INTF=0                      'oluGan int flag'ini temizle 
RBIF=0
Context Restore             'tüm kyıtlı reg. tekrar yüklenip keseden çıkılıyor
Enable                      'tüm int açık 
End 



ErsinErce

Kesmeler aktifken delayms kısımlarını olabildiğince küçük kullan
ayrıca portb4-7 arasını çıkış olarak değil giriş olarak tanımla (11110000)
OPTION_REG ile pull-up ları aktif de ediyorsun hatırlatıyım gerekiyorsa kullanırsın

devrenin bağlantı şeklini belli olmadığından şuanlık bu kadar,

-Hasan-

#2
Önemli olarak; RB4 - RB7 kesme bayrağı PIC açıldığında veya restlendiğinde otomatik olarak "1" değerini alır bu yüzden kesmeleri açmadan önce bu bayrağı sıfırlamanaız gerekir. Aksi taktirde RB4 - RB7 ' de bir değişiklik olmamasına rağmen INTCON.7=1 yani tüm kemeler açıldığı anda direkt RB4 - RB7 kesme programına gidersiniz.

Programınızda:

INTE=1
RBIE=1
RBIF=0
GIE=7

veya

INTCON=$18


şeklinde olması gerekir.

Bir de; RB4 - RB7 ile RB0 kesmesini beraber kullanıyorsunuz galiba.

forumsad

'****************************************************************
'****************************************************************
Device 16F877A ;ENTEGRE TANIMLAMA
Xtal 4 ;KRISTAL FREKANSI 
'------------------------------------------------------------------------

TRISA=%11111111
TRISB=%11110000  'PORTB0 GIRIS DIGERLERI ÇIKIS OLSUN
TRISC=%10000000
TRISD=%00000000
TRISE=%00000000




'PB4-7 change kesme ayarlari------------------------------------------------------
On_Hardware_Interrupt GoTo KESME     'Hardware interrupt Olusunca INT ye git
OPTION_REG = %00000000 'INTERRUPT KÖSE DURUMU düşen kenar
INTCON  =%10001000     'global kesme aktif,portb4-7 change kesmesi aktif



Dim pb4 As Word
Dim pb5 As Word
Dim pb6 As Word
Dim pb7 As Word



'//////////////////////////////////////////////////////////////////////////
'çikislari temizle 
PORTA=0 
PORTB=0 
PORTC=0 
PORTD=0
PORTE=0




'__________________________________________________________________________________________________
BASLA:
'*****************************************
Enable             'kesme devrede 
'*****************************************
DelayMS 50
PORTC.0=1
PORTC.1=0


PORTD.0=1 
DelayMS 200
PORTD.0=0 
DelayMS 200

PORTD.1=1 
DelayMS 200
PORTD.1=0 
DelayMS 200

PORTD.2=1 
DelayMS 200
PORTD.2=0 
DelayMS 200

PORTD.3=1 
DelayMS 200
PORTD.3=0 
DelayMS 200

PORTD.4=1 
DelayMS 200
PORTD.4=0 
DelayMS 200

PORTD.5=1 
DelayMS 200
PORTD.5=0 
DelayMS 200

PORTD.6=1 
DelayMS 200
PORTD.6=0 
DelayMS 200

PORTD.7=1 
DelayMS 200
PORTD.7=0 
DelayMS 200






GoTo BASLA

'/////////////////////////////////////////////////
'/////////////////////////////////////////////////
'/////////////////////////////////////////////////



'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
KESME:
Disable            'kesmeyi pasif
Context Save                'kaldığı yeri sakla 
PORTC.1=1


If PORTB.4=0 Then pb4=1



INTCON.0=0 
Context Restore             'tüm kyıtlı reg. tekrar yüklenip keseden çıkılıyor      	
Enable
GoTo BASLA
'-------------------------------------------------------------------------------------------------------------




End


kodun son hali bu bu şekilde çalıştırmayı başardım son bir sorun kaldı

kesme içindeki
If PORTB.4=0 Then pb4=1   satırını sildiğimde isis sümülasyonunda kod kesmede çakılı kalıyor
nedenini anlayamadım

-Hasan-

#4
İmkanın varsa bu programı bir de gerçek bir devrede dene. Proteus bazen hatasız yerlerde bile sorun çıkarabiliyor, bazen de program hatalı olduğu halde program hiç hata yokmuş gibi çalışıyor, bunları bizzat yaşadım:

Bir ara ASM ' de GLCD ' ye resim oluşturan bir program yazmıştım, proteusta sorunsuz bir şekilde çalıştı ancak gerçek devreye taktığımda GLCD ' de çok alakasız tuhah şeyler çıktı.

Proteus seni kandırabilir, ona çok fazla güvenme. ???

forumsad

evet bende öyle yapmayı düşünüyorum   

gerçek bir kartda deneyene kadar bu sorun çözülmüştür arkadaşlar ilğinize cevaplarınıza teşekkürler

saygılarımla