portb interrupt ı nasıl yapılır

Başlatan muhittin_kaplan, 01 Mart 2009, 22:50:55

muhittin_kaplan

Device 16F84A
        XTAL=4

        On_hardware_Interrupt GoTo KESME
        INTCON = %10001000
        OPTION_REG = %10000000

        TRISB = 1
        TRISA=0

        PORTA=0
        PORTB = 0
        Dim DEGER As Bit
        Dim DURDUR As Bit
      
ANADONGU:
        PORTA.0=0
        If DEGER=0 Then
            GoTo ANADONGU
        Else
         GoTo GONDER
        EndIf
        GoTo ANADONGU
        
GONDER:
        If DURDUR=1 Then GoTo ANADONGU
        PORTA.0=0
        DelayMS 20
        PORTA.0=1
        DelayMS 20
        GoTo GONDER        
        End
        Context SAVE
        
KESME:

        If DEGER=0 Then
            DEGER=1
            DURDUR=0
        Else
            DEGER=0
            DURDUR=1
        EndIf
        INTCON.0 = 0             
        Resume
        Context Restore
End


kodlar yukarda
devre aşağıda ne yanlış yapmışım acaba da bu portb kesmesi çalışmıyor..


Maxim

kodu anlatırmısın ? sanki hata var

dombilik

Device 16F84A 
        XTAL=4
        Dim DEGER As Bit 
        Dim DURDUR As Bit 
        TRISB = %11111111 
        TRISA=%00000000  
        INTCON = %10001000 
        OPTION_REG = %10000000 
        PORTA=0 
        PORTB = 0
        On_hardware_Interrupt GoTo KESME 
ANADONGU:
......



PULL-UP ları açmışsın..yani normal şartlarda PORTB=%11111111 dir..
butonları port ile gnd arasına direk bağlayabilirsin..
PORTB eğer giriş ise PORTB=0 tabirini de anlayamadım(PULL-UP lar açık)..
Bildiklerini kime miras bıraktın?kimseyemi? O zaman bildiklerinin ne önemi kalır. ******** /////////// ******** PROTON-ASM PROTEUS 7.4 SP3 EAGLE 5.40

dombilik

Interrupt Declare

DECLARE FSR_CONTEXT_SAVE = ON or OFF, or TRUE or FALSE, or 1, 0
When using HARDWARE interrupts, it is not always neseccary to save the FSR register. So in order to save code space and time spent within the interrupt handler, the FSR_CONTEXT_SAVE DECLARE can enable or disable the auto Context saving and restoring of the FSR register.

Help dosyasından gördüğüm kadarı ile programında deklerasyon da yapmamışsın..(Gerçi derleyici default olarak on yapıyormu yapmıyormu..bilmiyorum)
Bildiklerini kime miras bıraktın?kimseyemi? O zaman bildiklerinin ne önemi kalır. ******** /////////// ******** PROTON-ASM PROTEUS 7.4 SP3 EAGLE 5.40

muhittin_kaplan

Doğrudur Epey Hata Var.
Kısaca Yapmak İstediğim Şu
Butonun Birine Bastığımda PORTA.0 çıkısıdan kare dalga çıkmaya başlayacak Diğer Butona BAstığımda PORTA.0 çıkısı kesip PORTA.1 çıkışından Karedalga çıkmaya başlayacak. ilk butona bastığımda karedalgayı kesecek..
ama çok yıkamışım sanırım..

dombilik

Kesme doğru olarak dallansa dahi INTCON = %10001000
olduğundan yani PORTB.4,5,6,7 deki bir değişim kesme olarak algılanacağından dolayı kullandığın butonlarda direk bu pinlere bağlı olduğun hangi butona basarsan bas hep kesme programın çalışacaktır...Öncelikle o kısmı düzeltmen lazım..
Bildiklerini kime miras bıraktın?kimseyemi? O zaman bildiklerinin ne önemi kalır. ******** /////////// ******** PROTON-ASM PROTEUS 7.4 SP3 EAGLE 5.40

karbal656

Merhaba , kesme ile uğraşmana gerek yok aşağıdaki programı bir dene istersen .

Device 16F84A 
XTAL=4 
PORTA=0 
PORTB = 0 
TRISB = 255 
TRISA=0 
dur:
Low PORTA.0
Low PORTA.1
'******************************************
basla:
If PORTB.4 = 1 Then
DelayMS 150
GoTo A0
EndIf
If PORTB.5 = 1 Then
DelayMS 150
GoTo A1
EndIf
GoTo basla
'*******************************
A0:
Toggle PORTA.0
DelayMS 20
If PORTB.5 = 1 Then
Low PORTA.0
DelayMS 150
GoTo A1
EndIf
GoTo A0
'*****************************************
A1:
Toggle PORTA.1
DelayMS 20
If PORTB.4=1 Then
DelayMS 150
GoTo dur
EndIf
GoTo A1
End

dombilik



Device 16F84A
Declare XTAL 4
Dim k As Byte

TRISA=0
TRISB=%11111111
INTCON=%10010000
OPTION_REG=%11000000
 ON_hardware_INTERRUPT GoTo kesme
PORTA=0
PORTB=0
k=0
start_kontrol:
    k=0
    PORTA.0=0
    If PORTB.1=1 Then GONDER
    DelayMS 10:GoTo start_kontrol
GONDER: 
        If k=1 Then GoTo start_kontrol
        PORTA.0=0 
        DelayMS 20 
        PORTA.0=1 
        DelayMS 20 
        GoTo GONDER 
Disable
kesme:
    PORTA.0=0
    k=1
    INTCON=%10010000
    Resume
    Enable

RB0 kesmesini kullanarak yaptım.Çalışıyor.
Bildiklerini kime miras bıraktın?kimseyemi? O zaman bildiklerinin ne önemi kalır. ******** /////////// ******** PROTON-ASM PROTEUS 7.4 SP3 EAGLE 5.40

muhittin_kaplan

İlgi ve Cevaplarınız İçin Teşekkür Ederim

Yanlız
@karbal656;
Butonlara Basılı Tutmayacağım birkez bastığımda Konumu Değiştirecek. Bu Değişiklik Birinci Buton İçin Başla/Durdur, İkinci İçin Sağ/Sol seçimi Olacak.

@dombilik;
Sizde SağSol Seçimi RB0 ile yapmışsınız Ama Gönderme İşlemi İçin Butona BAsılı Tutulması Gerekiyor..

dombilik

Sanırım ben sorunuzu yanlış anladım..
Benim örnekte RB1 deki buton osilasyonu başlatır.RB0 ise kapatır..
Bildiklerini kime miras bıraktın?kimseyemi? O zaman bildiklerinin ne önemi kalır. ******** /////////// ******** PROTON-ASM PROTEUS 7.4 SP3 EAGLE 5.40

muhittin_kaplan


Devre Bu
       Device 16F84A
        XTAL 4 
	   ON_INTERRUPT GoTo KESME
	   PORTB_PULLUPS=On
	   OPTION_REG.6=1
	   Symbol RBIF INTCON.0 		
	   Symbol RBIE INTCON.3 	  	
	   Symbol GIE INTCON.7		
	   	
       	
       Dim DonguSayisi As Byte
       
       Dim Gonder As Bit
       Dim Durum As Bit
       Dim Secim As Bit
       
       TRISA=0
       TRISB=%11110000
       PORTA=0
       GoTo Over_interrupt
       
KESME:
	
    GIE = 0
	RBIE=0
	
	If DonguSayisi<1 Then   
        Select Case PORTB
        Case %11100111
            If Gonder=0 Then
                Gonder=1  
            Else
                Gonder=0
            EndIf
        Case %11010111
             If Secim=0 Then
                Secim=1
                Low PORTA.2
                High PORTA.3
             Else
                Secim=0
                High PORTA.2
                Low PORTA.3 
             EndIf                    
        EndSelect
	EndIf       
    	
	RBIE=1
	RBIF = %00000000 
	GIE = 1
    Context Restore	

' START OF PROGRAM	
Over_interrupt:

    GIE = 0 				  ' Turn off global interrupts
	RBIF=%00000000  		  ' Erase RBIF bit at program initialization			
	RBIE = 1				  ' RBIE bit set to 1 to enable Interrupt 
	GIE = 1 				  ' Enable global interrupts
    High PORTA.2
    Low PORTA.3
ANA_DONGU:
    DonguSayisi=0 	
	If Gonder=1 Then
        If Secim=0 Then
            High PORTA.0
            DelayMS 50
            Low PORTA.0
            DelayMS 50
        Else
            High PORTA.1
            DelayMS 50
            Low PORTA.1
            DelayMS 50
    	EndIf
	Else
	EndIf
	GoTo ANA_DONGU
End


Yukarısı SIM de çalışıyor Ama int. İki Kez Giriyor Bunu Engellemek İçin DONGUSAYISI adında bir kontrol biti koydum..
ama inceleyip bu problemi çözebilirsek sevineceğim.