Usart Kesmesi-Portb.0 kesmesi ve donanımsal PWM aynı anda çalışırmı

Başlatan sezgin05, 17 Aralık 2014, 10:57:52

sezgin05

Arkadaşlar yapmayı düşündüğüm bir, çok noktalı alarm projesinde 20 slave modülü ve 1 Master RS 485 donanımıyla bağlanacaktır. Slave lerde donanımsal PWM ile infrared sinyali üretip, yansımasını PortB.0  donanımsal kesmesiyle okutup alarm durumunu 1 veya 0 ile Master sorduğunda Mastera cevap verecek.Henüz başlamadan tecrübeli arkadaşlara danışmak istiyorum.Teşekkürler.

Mucit23

Öyle bir sınır yok. Aynı anda birden fazla kesme kullanabilirsin. Dolayısıyla RB0 kesmesi ile Usart kesmesinide aynı anda kullanabilirsin. PWM'i zaten CCP donanımından alacaksın dolayısıyla bunun işlemciye ekstra bir yükü olmaz.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

sezgin05


Device 16F628A
Xtal 4

Config INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_OFF,LVP_OFF,CP_Off, MCLRE_ON,BODEN_ON
All_Digital = TRUE
CMCON=7
Declare Hserial_Baud=2400
Declare Hserial_RCSTA=$90h
Declare Hserial_TXSTA=$20h
Declare Hserial_SPBRG= 25
Declare Hserial_Clear   =   On

Symbol PEIE =INTCON.6   'peripheral interruptları açiyor
Symbol RCIE =PIE1.5     'USART Recive interrupt enable bit
Symbol RCIF =PIR1.5     'USART Receive interrupt flag bit
Symbol INTF = INTCON.1        ' RB0 External Interrupt Flag
Symbol INTE = INTCON.4        ' RB0 External Interrupt Enable
Symbol GIE  = INTCON.7

On Interrupt    GoTo    KESME
On_Interrupt INT

Declare CCP1_Pin PORTB.3
PR2=25                         'maximum duty cycle 105
CCP1CON=%00001100                     '38khz
TMR2=0

TRISA = %00000000
TRISB = %00000011

Dim wave As Byte
Dim X As Byte
Dim pulse As Byte
Dim X1 As Byte
Dim X2 As Byte
Dim TEMP As Byte
X1=0
X2=0


GoTo over_irq
DelayMS 5
Cls

Clear
PORTB=0
PORTA=0
X=0
pulse=0
RCIE=1: PEIE=1:GIE=1
DelayMS 200
'**************************************
INT:
Context Save
If PORTB.0=1  Then
   Inc pulse
   
EndIf
   
INTF=0
Context Restore                            'portb.0 donanımsal kesmesiyle
                                            'infrared sinyal yansıması alınıyor
over_irq:
GIE  =0
INTE =1
GIE  =1

DelayMS 10

'**************************************
main:
X2=0

pulse=0
For X=0 To 20
wave=40
Call hesapla                         '38khz pwm infrared için açılıp kapanıyor
DelayUS 600
wave=0
Call hesapla
DelayMS 5
Next X

If pulse < 10 Then
PORTA.1=1 : PORTA.0=0  :X2=1
Else                                'durum ledlerinin yakıldığı kısım
PORTA.1=0 : PORTA.0=1  :X2=0
EndIf

GoTo main
End
'**************************************



hesapla:
CCP1CON=%00001100               
T2CON=%00000100                ' pwm oluşturma kısmı
CCP1CON.4=wave.0
CCP1CON.5=wave.1
CCPR1L=wave>>2
Return

GoTo main
End

'**************************************
Disable
KESME:
GIE=0
PORTB.4=0
DelayMS 5
HSerIn 10,CIK,[Wait("A"),X1 ]
If X1=1 And X2=1 Then
    PORTB.4=1                                      'seri bilgi okuma kesmesi
    DelayMS 5
    HSerOut ["A",1]
    HSerOut ["A",1]
EndIf
TEMP=RCREG
CIK:
RCIF=0 
GIE=1     
Resume                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
Enable
'**************************************
End


verdiğim kodda yazılımsal usart kesmesi iptal edilmezse program şişiyor.hatam nerede olabilir.

ete

Aynı program içinde hem donanım kesmesi hemde yazılım kesmesi ayrı etiketlere yönlenecek şekilde açılabildiğini bilmiyordum.
Proton buna müsade ediyor ise diyecek lafım yok ama bana kalırsa tek bir kesme etiketi olmalı ve kesme bayraklarına bakılarak işlem yapılmalıdır diye düşünüyorum.
Proton buna derleme esnasında itiraz etmeyebilir ama uygulamada neye göre hareket ettiğini anlamak çok zor. Zira aynı anda her iki kesme oluşursa ne yapacak bir öncelik sırasımı uygulayacak yoksa sıradan önce birisine sonra diğerine mi gidecek program. Terslik burada işte. Halbuki tek etiket altında toplanırsa her ikiside aynı anda işlenebilir. Ayrı ayrı olursa puls sayan PORTB.0 kesmesi puls sayamayacak diğeride puls sayılırken gelen USART bilgisini alamayacaktır.

Ete

Powered by EzPortal