kesmeyi beceremedim

Başlatan onurinci, 04 Nisan 2017, 21:53:49

onurinci

hocam uygulamara falan bakarak yapmaya çalıştım,olduramadım
iki hane dip svicim var bunları değiştirmek vasıtası ile ilgili entegrenin registerlerine bilgi yolluyorum,sonuçta devrem çalıştı,fakat bu bir alıcı devresi olduğu için bu yollanma sırasında duyulabilecek gibi bir gürültü hasıl oluyor,problem hep yollamaya devam ediyor,isteğim dip siviç değişikliğe uğrar ise yollsın ,bittikten sonra yollamayı kessin,taki dip siviç ile tekrar oynanana kadar.
basitce @ sleep ve NAP ile denedim WDT on yaptım ,tamam bir kez yolluyor fakat port değişikliğinde uyanmıyor..


@ Device PIC16F628A,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT,LVP_OFF
DEFINE OSC 4

TRISA= %00000000 : PORTA= 0
TRISB= %11000000 : PORTB= 0
CMCON= 7 : OPTION_REG.7= 0

ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.

INTCON=%10001000  'Kesmeler aktif ve   PORTB Değişiklik kesmesi aktif



DEFINE SHIFT_PAUSEUS 2                          ' DATA Speed

SYMBOL DA= PORTA.0                               ' DATA pin
SYMBOL CK= PORTA.1                               ' CLOCK pin
SYMBOL EN= PORTA.2                               ' ENABLE pin
                             
LOW EN                                          ' Enable'i Low make
PAUSE 200



Start:
DISABLE
KESME:
;----------------------------------------

IF PORTB= %00000000 THEN                'Ch01

       SHIFTOUT DA,CK,4,[$C1,$16,$6C,$01,$01]    ' 1MHz  $01 PLL on   00 PLL off
      LOW CK
      PULSOUT EN,3                               ' Enable gönder

ENDIF

;----------------------------------------

IF PORTB= %01000000 THEN                 'Ch02
       SHIFTOUT DA,CK,4,[$C1,$16,$6C,$02,$01]    ' 1MHz  $01 PLL on   00 PLL off
      LOW CK
      PULSOUT EN,3                              ' Enable gönder

ENDIF

;----------------------------------------
IF PORTB= %10000000 THEN               'Ch03
       SHIFTOUT DA,CK,4,[$C1,$16,$6C,$03,$01]    ' 1MHz  $01 PLL on   00 PLL off
      LOW CK
      PULSOUT EN,3                              ' Enable gönder


ENDIF
'';-----------------------------------------
  IF PORTB= %11000000 THEN               'Ch04
      SHIFTOUT DA,CK,4,[$C1,$16,$6C,$04,$01]    ' 1MHz  $01 PLL on   00 PLL off
      LOW CK
      PULSOUT EN,3                              ' Enable gönder


ENDIF
;------------------------------------------
disable
'-------------------------------------------------------------------------------
'KESME:

'      INTCON.1= 0

RESUME : ENABLE
END 

'     GOTO Start
'     end

ete

PORTB.0 ve PORTB. pinlerini sanırım dipswitch'e bağladın. PORTB.0 INT kesmesine bağlanmış peki PORTB.1 ne olacak onu nasıl agılayacaksın?
Ben olsam B6 ve B7 pinlerini kullanır ve portb değişiklik kesmesi kullanırdım. Böylece pinlerden hangisinde değişiklik olursa onu algılayıp kesme oluştururdum. Kullanılabilecek pinler PORTB.4-PORTB.7 arasındaki pinlerdir.

Ete

onurinci

#2
hocam kazara yaptım galiba simulasyonda normal gözüküyor,incelerseniz sevinirim..

@ Device PIC16F628A,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT,LVP_OFF
DEFINE OSC 4

TRISA= %00000000 : PORTA= 0
TRISB= %11000000 : PORTB= 0
CMCON= 7 : OPTION_REG.7= 0



INTCON=%00001000  'Kesmeler aktif ve   PORTB Değişiklik kesmesi aktif



DEFINE SHIFT_PAUSEUS 2                          ' DATA Speed

SYMBOL DA= PORTA.0                               ' DATA pin
SYMBOL CK= PORTA.1                               ' CLOCK pin
SYMBOL EN= PORTA.2                               ' ENABLE pin
                             
LOW EN                                          ' Enable'i Low make
PAUSE 200

'ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.

Start:


;----------------------------------------

IF PORTB= %00000000 THEN                'Ch01

       SHIFTOUT DA,CK,4,[$C1,$16,$6C,$01,$01]    ' 1MHz  $01 PLL on   00 PLL off
      LOW CK
      PULSOUT EN,3                               ' Enable gönder
@ sleep
ENDIF
' DISABLE
;----------------------------------------

IF PORTB= %01000000 THEN                 'Ch02
       SHIFTOUT DA,CK,4,[$C1,$16,$6C,$02,$01]    ' 1MHz  $01 PLL on   00 PLL off
      LOW CK
      PULSOUT EN,3                              ' Enable gönder
@ sleep
ENDIF

;----------------------------------------
IF PORTB= %10000000 THEN               'Ch03
       SHIFTOUT DA,CK,4,[$C1,$16,$6C,$03,$01]    ' 1MHz  $01 PLL on   00 PLL off
      LOW CK
      PULSOUT EN,3                              ' Enable gönder
@ sleep

ENDIF
;-----------------------------------------
  IF PORTB= %11000000 THEN               'Ch04
      SHIFTOUT DA,CK,4,[$C1,$16,$6C,$04,$01]    ' 1MHz  $01 PLL on   00 PLL off
      LOW CK
      PULSOUT EN,3                              ' Enable gönder
@ sleep
ENDIF
;------------------------------------------
' DISABLE
'-------------------------------------------------------------------------------
'KESME:

'     INTCON.1= 0

'RESUME : ENABLE
'END 

'     GOTO Start
'     end

ete

Amacın sadece uykudan uyandırmak ise olmuş diyebiliriz bir eksik ile. Değişiklik kesmesi daima son PORT durumunu dikkate alarak çalışır. Bu nedenle uykuya sokmadan önce TEMP=PORTB & %11000000  yazman uygun olacaktır. (TEMP değişkenini tanımlaman gerek)
Böylece sistem uykuya girmeden önce TEMP değişkenine Portun yani giriş pinlerinin durumunu okutur. Daha sonra uykuda bu pinlerde değişiklik olursa uyanır ve seleep komutundan bir sonraki satıra geçer.
Aslında işin doğrusunda,
Kesme etiketini açman ve orada;
INTCON.0=0
TEMP=PORTB & %11000000
Resume
Enable
yazıp kesmeden çıkman en doğrusudur. Böylece ana programda başka bir şey yapman gerekmiyor. Kesme bayrağının sıfırlanmaması sorun çıkartabilir ki sen öyle yapıyorsun. Ama dediğim şekilde sorun olmaz.
Ete

onurinci

hocam dediklerinizi uygulamaya çalıştım, Stack overflow ve Return hatası almaya başladım doğru taşları ,doğru yere koyamadım sanırım,programa müdahele edebilirmisiniz ?

@ Device PIC16F628A,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT,LVP_OFF
DEFINE OSC 4

TRISA= %00000000 : PORTA= 0
TRISB= %11000000 : PORTB= 0
CMCON= 7 : OPTION_REG.7= 0


INTCON=%00001000  'Kesmeler aktif ve   PORTB Değişiklik kesmesi aktif


DEFINE SHIFT_PAUSEUS 2                          ' DATA Speed

SYMBOL DA= PORTA.0                               ' DATA pin
SYMBOL CK= PORTA.1                               ' CLOCK pin
SYMBOL EN= PORTA.2                               ' ENABLE pin
                             
LOW EN                                          ' Enable'i Low make
PAUSE 200

TEMP   VAR BYTE;------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.

Start:


;----------------------------------------

IF PORTB= %00000000 THEN                'Ch01

       SHIFTOUT DA,CK,4,[$C1,$16,$6C,$01,$01]    ' 1MHz  $01 PLL on   00 PLL off
      LOW CK
      PULSOUT EN,3                               ' Enable gönder
@ sleep
ENDIF
' DISABLE
;----------------------------------------

IF PORTB= %01000000 THEN                 'Ch02
       SHIFTOUT DA,CK,4,[$C1,$16,$6C,$02,$01]    ' 1MHz  $01 PLL on   00 PLL off
      LOW CK
      PULSOUT EN,3                              ' Enable gönder
@ sleep
ENDIF

;----------------------------------------
IF PORTB= %10000000 THEN               'Ch03
       SHIFTOUT DA,CK,4,[$C1,$16,$6C,$03,$01]    ' 1MHz  $01 PLL on   00 PLL off
      LOW CK
      PULSOUT EN,3                              ' Enable gönder
@ sleep

ENDIF
;-----------------------------------------
  IF PORTB= %11000000 THEN               'Ch04
      SHIFTOUT DA,CK,4,[$C1,$16,$6C,$04,$01]    ' 1MHz  $01 PLL on   00 PLL off
      LOW CK
      PULSOUT EN,3                              ' Enable gönder
@ sleep
ENDIF
;--------------------------------------------------
KESME:  ;----------------
INTCON.0=0  ;----
TEMP=PORTB & %11000000  ;-----
Resume  ;------
Enable  ;------

ete

#5
Kesme etiketinden önce bir DISBLE yazman gerekiyor.
Disable den önce de GOTO START yazman gerekir bu asıl sorunu yaratan eksiklik.
ete


onurinci

hocam sayenizde bu sorunuda aştım ,sağolun varolun....şimdi gerçek devrede denedim çok güzel çalıştı..

Powered by EzPortal