usart donanim kesmesi ve serin iletisim

Başlatan selvi, 31 Aralık 2013, 18:35:44

selvi

  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
Yaşam anlamlandırıldıkça kutsaldır....

ferit06

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?

selvi

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.
Yaşam anlamlandırıldıkça kutsaldır....

sezgin05

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.

Maxim

@sezgin05
çalışmayan örnek bir kod üzerinden devam etmek lazım