Kesme

Başlatan Ankaralı, 05 Ağustos 2009, 22:07:32

Ankaralı

Edit:
Hayırlı akşamlar hayırlı kandiller.

İlk defa kesme işlemini kullanacağım...Yazdığım şu basit programa kesme işlemini nasıl uygularım?Yani pic alt programda TIP_1 kısmını okurken ben butona bastığım anda TIP_2 yi bida bastığımda TIP_3 alt programa gitmesini istiyorum.

Teşekkürler,

Device=16F628A
Config INTRC_OSC_NOCLKOUT , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE
PORTB_PULLUPS TRUE
'-------------------------------------------
TRISA=0
TRISB=255
PORTA=0
'-------------------------------------------
Symbol BUTON=PORTB.0
Dim SAYAC As Byte
SAYAC=0
'-------------------------------------------
BASLA:

If BUTON=0 Then
While BUTON=0
Wend
If SAYAC<3 Then
SAYAC=SAYAC+1
Else
SAYAC=0
DelayMS 250
EndIf
EndIf

If SAYAC=1 Then GoSub TIP_1
If SAYAC=2 Then GoSub TIP_2
If SAYAC=3 Then GoSub TIP_3

GoTo BASLA

TIP_1:
PORTA=%00000001
DelayMS 100
PORTA=0
DelayMS 100
PORTA=%00000001
DelayMS 100
PORTA=0
DelayMS 100
PORTA=%00000001
DelayMS 100
PORTA=0
DelayMS 100
PORTA=%00000001
DelayMS 100
PORTA=0
DelayMS 100
PORTA=%00000001
DelayMS 100
PORTA=0
DelayMS 100
PORTA=%00000010
DelayMS 100
PORTA=0
DelayMS 100
PORTA=%00000010
DelayMS 100
PORTA=0
DelayMS 100
PORTA=%00000010
DelayMS 100
PORTA=0
DelayMS 100
PORTA=%00000010
DelayMS 100
PORTA=0
DelayMS 100
PORTA=%00000010
DelayMS 100
PORTA=0
DelayMS 100
Return

TIP_2:
PORTA=%00000011
DelayMS 250
PORTA=0
DelayMS 250
PORTA=%00000011
DelayMS 250
PORTA=0
DelayMS 250
Return

TIP_3:
PORTA=%00000001
DelayMS 250
PORTA=0
DelayMS 250
PORTA=%00000001
DelayMS 250
PORTA=0
DelayMS 250
PORTA=%00000010
DelayMS 250
PORTA=0
DelayMS 250
PORTA=%00000010
DelayMS 250
PORTA=0
DelayMS 250
Return

End
@ NEXYS2

tyildizak

selamlar,

interrupt seçenekleri  intcon yazmacıyla ayarlanıyor. Burada 4. bit(inte) set edildiğinde rb0 kesmesini, 7. bit (gie) set edildiğinde de global olarak kesmeleri kuruyor.

Ayrıca option yazmacı 6. bitini (intedg)  0 bırakırsanız , rb0  düşen kenarda, set ederseniz da yükselen kenarda kesme oluşmasını tercih edebiliyorsunuz.

kesme oluştuğunda programın nereye dallanacağı, tanımlamalar kısmında "on interrupt goto xxxx" şeklinde deklare ediliyor. kesme rutini de en alta yazılıyor, başına disable( kesme rutini komutları çalışırken ardarda yeni kesmeler gelmemesi için) sonuna da resume( gelinen vektöre dönülmesi için) ve enable (tekrar kesmeyi kurmak için) ekleniyor.


tüm bunları şu şekilde toparlıyoruz:

    Device=16F628A
     Config INTRC_OSC_NOCLKOUT , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_OFF, MCLRE_OFF
     ALL_DIGITAL TRUE

'-------------------------------------------
     TRISA=0
     TRISB=255
     PORTA=0
     portb= 0
     i var byte

'-------------------------------------------
     on interrupt goto yak


     intcon = 10010000
     option_reg = 10000000


basla:

          PORTA=1
          DelayMS 100
          PORTA=0
          DelayMS 100

     goto basla


     disable
    
yak:
     for i = 0 to 2
          PORTA=3
          DelayMS 250
          PORTA=0
          DelayMS 250
     next i

     resume 

     enable



End[/quote]



kolay gelsin

Murat Mert

Selamlar
Bunu SELECT CASE komutuylada yapabilirsin. İstersen bir bak.
Device=16F628A 
Config INTRC_OSC_NOCLKOUT , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_OFF, MCLRE_OFF 
ALL_DIGITAL TRUE 
PORTB_PULLUPS TRUE 
'------------------------------------------- 
TRISA=0 
TRISB=255 
PORTA=0 
'------------------------------------------- 
Symbol BUTON=PORTB.0 
Dim SAYAC As Byte 
SAYAC=0 
'------------------------------------------- 
BASLA: 

If BUTON=0 Then 
SAYAC=SAYAC+1
ElseIf SAYAC>3 Then 
SAYAC=0 
EndIf 


Select Case SAYAC

Case 1:
PORTA=%00000001 
DelayMS 100 
PORTA=0 
DelayMS 100 
PORTA=%00000001 
DelayMS 100 
PORTA=0 
DelayMS 100 
PORTA=%00000001 
DelayMS 100 
PORTA=0 
DelayMS 100 
PORTA=%00000001 
DelayMS 100 
PORTA=0 
DelayMS 100 
PORTA=%00000001 
DelayMS 100 
PORTA=0 
DelayMS 100 
PORTA=%00000010 
DelayMS 100 
PORTA=0 
DelayMS 100 
PORTA=%00000010 
DelayMS 100 
PORTA=0 
DelayMS 100 
PORTA=%00000010 
DelayMS 100 
PORTA=0 
DelayMS 100 
PORTA=%00000010 
DelayMS 100 
PORTA=0 
DelayMS 100 
PORTA=%00000010 
DelayMS 100 
PORTA=0 
DelayMS 100 
 

Case 2: 
PORTA=%00000011 
DelayMS 250 
PORTA=0 
DelayMS 250 
PORTA=%00000011 
DelayMS 250 
PORTA=0 
DelayMS 250 
 

Case 3: 
PORTA=%00000001 
DelayMS 250 
PORTA=0 
DelayMS 250 
PORTA=%00000001 
DelayMS 250 
PORTA=0 
DelayMS 250 
PORTA=%00000010 
DelayMS 250 
PORTA=0 
DelayMS 250 
PORTA=%00000010 
DelayMS 250 
PORTA=0 
DelayMS 250 
End Select 

GoTo BASLA
mert07

Ankaralı

@mert

Kusura bakma cevabını yeni gördüm.Burada maksat kesme'yi yapabilmek.Yani döngüdeyken kesme ile döngü'den çıkabilmek.
Emeğin için teşekkürler.
@ NEXYS2