usart donanim kesmesini ve serout/serin iletisimini beraber kullanmak icin tx ve rx kodlarini yazdim.ama ikisini beraber calistiramadim.kodlar asagidaki gibidir.
tx:
Device 16F628
'Xtal 4
Config CP_OFF, DATA_CP_OFF, PWRTE_ON, WDTE_OFF, LVP_OFF, MCLRE_ON, INTRC_OSC_NOCLKOUT, BOREN_OFF, DATA_CP_OFF, WDT_OFF, INTRC_OSC_NOCLKOUT
Declare Hserial_Baud=2400
'Declare Hserial_RCSTA=$90h
Declare Hserial_TXSTA=$20h
Declare Hserial_Clear=On
Declare Hserial_SPBRG=25
All_Digital = true
'CMCON=7 '16F628 de komparatör pinleri iptal hepsi giri? çyky?
PortB_Pullups = 0
TRISB=%00010000
TRISA=%11100111 '%00100100
PORTB=0
PORTA=0
'------------------------------------------------------------------------------
Dim VER As Byte
Dim VER1 As Byte
Dim I As Byte
Dim M As Byte
Symbol UYAN=PORTB.1
DelayMS 300
START:
If PORTA.0=0 Then 'ac
UYAN=1:VER=100
GoSub DATA1
DelayMS 100:UYAN=0
PORTB.7=1:DelayMS 50:PORTB.7=0 relay set
DelayMS 100
VER1=73
GoSub GONDER
EndIf
If PORTB.4=0 Then 'buton 1
VER1=142
GoSub GONDER
EndIf
If PORTA.6=0 Then 'kapat
UYAN=1:VER1=200
GoSub DATA1
DelayMS 100:UYAN=0
PORTB.6=1:DelayMS 50:PORTB.6=0 'red relay reset
DelayMS 100
VER1=4
GoSub GONDER
EndIf
DelayMS 300
GoTo START
GONDER:
SerOut PORTA.3,84,[Rep $AA\5,Rep $00\5,Rep $FF\5]
SerOut PORTA.3,84,[Rep $AA\5,Rep $00\5,Rep $FF\5]
SerOut PORTA.3,84,["D","E","M",VER1]
SerOut PORTA.3,84,["D","E","M",VER1]
SerOut PORTA.3,84,["D","E","M",VER1]
SerOut PORTA.3,84,["D","E","M",VER1]
SerOut PORTA.3,84,["D","E","M",VER1]
Return
'-------------------------ALT PROGRAMLAR---------------------------------------
DATA1:
HSerOut [Rep $AA\5,Rep $00\5,Rep $FF\5]'uyandirma sinyali preambl
HSerOut ["A","R","A",Dec VER,123]
HSerOut ["A","R","A",Dec VER,123]
HSerOut ["A","R","A",Dec VER,123]
Return
End
rx:
Device 16F628A
'Xtal 4
Config BOREN_OFF, CP_OFF, DATA_CP_OFF, PWRTE_ON, WDT_OFF, LVP_OFF, MCLRE_OFF, INTRC_OSC_NOCLKOUT, DATA_CP_OFF, WDTE_OFF
Declare Hserial_Baud=2400 'MAXIBOOST
Declare Hserial_RCSTA=$90h 'MAXIBOOST
'Declare Hserial_TXSTA=$20h 'MAXIBOOST
Declare Hserial_Clear=On 'MAXIBOOST
Declare Hserial_SPBRG=25 'MAXIBOOST
CMCON=7 '16F628 de komparatör pinleri iptal hepsi giriþ çýkýþ
PortB_Pullups =0
TRISB=%10100010
TRISA=%00000000
PORTB=0
PORTA=0
Symbol GIE =INTCON.7 'genel interruptlarý açýyor
Symbol PEIE =INTCON.6 'peripheralinterruptlarý açýyor
Symbol RCIE =PIE1.5 'USART Recive interrupt enable bit
Symbol RCIF =PIR1.5 'USART Receive interrupt flag bit
RCIE=1:PEIE=1:GIE=0
Dim AL As Byte
Dim AL1 As Byte
Dim US As Bit
Dim LM As Bit
Dim K As Byte
Dim TEMP As Byte
Symbol LED =PORTA.0
Symbol ROLE1=PORTA.1
On_Hardware_Interrupt GoTo KESME 'donanimsal kesme
Clear
DelayMS 200
BASLA:
SerIn PORTB.5,84,[Wait("DEM"),AL1]
If LM=1 Then
LM=0
If AL=100 Then
PORTB.4=1:AL=0
EndIf
If AL=200 Then
PORTB.4=0:AL=0
EndIf
EndIf
If AL1=73 Then 'Ac
US=1
For K=0 To 4
LED=1:DelayMS 100:LED=0:DelayMS 100
Next K
LED =1:DelayMS 100:LED=0
EndIf
If US=1 Then
If AL1=142 Then 'role1
ROLE1=1:LED =1:DelayMS 500:LED=0:DelayMS 1500:ROLE1=0
EndIf
If AL1=4 Then 'kapat
US=0
LED =1:DelayMS 500:LED=0:DelayMS 500
LED =1:DelayMS 500:LED=0
EndIf
EndIf
GoTo BASLA
;---------USART KESME-----------
'Disable
KESME:
Context Save 'sistem yazmaçlar? yedeklenir
GIE=0 'tüm interruptlar? kapat yani INTCON.7=0
LM=0
AL=0
HSerIn 5,BIR,[Wait("ARA"),Dec AL]
TEMP=RCREG
TEMP=0
RCREG=0
LM=1
GoTo CIK
BIR:LM=0
CIK:
Clear RCSTA.4
Set RCSTA.4
Context Restore ' yedeklenen deg(erler geri çag(?r?l?p tekrar ana programa dönülür.
GIE=1 'Yani INTCON.7=1 kesmeleri açt?k.
'Resume
'Enable
End
Sorun hala devam ediyormu?
Kesme ile ilgili kısımda
Context Save 'sistem yazmaçlar? yedeklenir
GIE=0 'tüm interruptlar? kapat yani INTCON.7=0
LM=0
AL=0
HSerIn 5,BIR,[Wait("ARA"),Dec AL]
TEMP=RCREG
TEMP=0
RCREG=0
LM=1
GoTo CIK
BIR:LM=0
CIK:
Clear RCSTA.4
Set RCSTA.4
Context Restore ' yedeklenen deg(erler geri çag(?r?l?p tekrar ana programa dönülür.
GIE=1 'Yani INTCON.7=1 kesmeleri açt?k.
GIE=1 'Yani INTCON.7=1 'yi
Context Restore den önceye almak gerekli kesme programı Context Restore ile bitip geri dönüş yapar. Ayrıca programın diğer kısımlarını inceledim ama GIE=1 göremedim kesmeleri açmıyorsanız neden programda kesme bölümü var?
Alıntı yapılan: ferit06 - 07 Ocak 2014, 16:52:39
Sorun hala devam ediyormu?
GIE=1 'Yani INTCON.7=1 'yi
Context Restore den önceye almak gerekli kesme programı Context Restore ile bitip geri dönüş yapar. Ayrıca programın diğer kısımlarını inceledim ama GIE=1 göremedim kesmeleri açmıyorsanız neden programda kesme bölümü var?
programda bahsettginiz sekilde GIE=0 yapilmisti.context restore den once gie=1 yaptim.onlari fark etmistim.oyle de denedim olmadi.
tek islemciyle yapamayinca iki tane islemciyle sorunu giderdim.ilk tercihim tek islemcide iki haberlesmeyi saglamakti.fakat yapamadim.
ayriyeten ccs c ile denedim olmadi.ilk etapta iki islemciyle yapayim dedim.zaten oyle yaptim.bu sekilde sorun cikmiyor.
tabi ugrasacagim.
Konu üzerinden epey zaman geçmiş ama aynı sorunla bende cebelleşiyorum. Yok mu bunun bir kolayı?
Usart her halukarda düzgün çalışıyor ama yanında TMR0 kesmesi çalışmıyor. İlginç olanı ise ISIS de sorunsuz simüle ediyor.
@sezgin05 çalışmayan örnek bir kod üzerinden devam etmek lazım