Protn + Donanımsal Kesme

Başlatan inventor, 11 Şubat 2011, 10:29:42

inventor

Merhaba Arkadaşlar.
Bende artık PBP dan ufak ufak kopup protona geçeyim dedim. Ama bir hafta içinde sinir hastası olup çıktım. Tek yapmam gereken iki adet 16f876 yı HSERIN ve HSEROUT komutları ile haberleştirmek. Girip çıkmadığım forum kalmadı. Kimi yerde hw kesmeye gitmeden önce disable komutu yazılmaz deniyor kimi yerde yazılır. Kimisinde kesme rutininde rcif=0 yazılır deniyor kimisinde rcreg i boşaltmak yeterlidir deniyor. Kimisinde ikiside olacak deniyor.Bir sitedeki örnekte HSERIN için context save - restore kullanılmamış kesme içinde kimisinde kullanılmış. Protonu kullanmak istememin 3 nedeni var. Donanımsal kesme-ondalık sayılarla işlem-print komutunun pratikliği. En çok bunlar için istiyorum. Görünen o ki geri dönüş yapacağız. Son kez forumda sorayım dedim.Piclerden  kodların kesmeyi ilgilendiren kısımlarını ekliyorum. Denemediğim konfigürasyon kalmadı gibi. Gördüğünüz sorunları yazarsanız sevinirim. Aşağıdaki satırlarda yapılmak istenen; diğer pic tarafından hserout ile göderilen bilgi ilgili pice gelir gelmez kesme oluşsun ve gelen veri biryerlere kaydedilsin.Bu her iki pic içinde geçerli. Şimdiden teşekkürler

Bu bölümdeki kodlar kumanda edilecek olan yerdeki kodlar oluyor
Xtal=4
Device =16F876A
@ CONFIG_REQ 
@ __config CP_OFF & WDT_OFF & XT_OSC & LVP_OFF & BODEN_OFF & PWRTE_ON 

OPTION_REG=%00000000
ADCON1=%00000111
define Hserial_RCSTA = %10010000 ' Enable serial port & continuous receive
define Hserial_TXSTA = %00100000 ' Gönderim açık
define Hserial_Baud  = 2400 
define Hserial_Clear = On ' Clear overflow automatically

Symbol GIE  =INTCON.7   'bütün  interruptları açıyor
Symbol PEIE =INTCON.6   'hardware interruptları açıyor
Symbol RCIE =PIE1.5     'USART RX (Alma) interrupt aç-kapat
Symbol RCIF =PIR1.5     'USART RX (Alma) interrupt flag bit

GIE=0  
PEIE=1
RCIE=1   
GIE=1
....................
On_Interrupt GoTo INT
eski=0
Durum1=0
durum2=0
Onay=0
hata1=0
ID=0
MOTOR1=0
MOTOR2=0
RCIF=0
;***************************************  B A S L A  ****************************************************
Basla: 
..................
HSerOut ["$","R","F",Bin BILGI,$45,$4E,$44,$0D,$0A]
..................
INT:  
    Context Save
    RCIF=0
    GIE=0
    While GIE=1
    GIE=0
    Wend
     HSerIn 5,ATLA, [Wait("$RF"),Bin Durum1,Bin durum2]   ;durum1= ID    durum2= start-stop
    If RCIF=1 Then 
        RCIF=0
        temp=RCREG
    EndIf
    Context Restore
    Stop     


Aşağıdaki kodlar ise kumanda ünitesindeki kodlardır.
Device =16F876A
Xtal=4
@ CONFIG_REQ 
@ __config CP_OFF & WDT_OFF & XT_OSC & LVP_OFF & BODEN_OFF & PWRTE_ON 

OPTION_REG=%00000000
ADCON1=%00000111
INTCON=%10100000

Hserial_RCSTA = %10010000 ' seriport açık-veri alımı açık
Hserial_TXSTA = %00100000 ' Gönderim açık
Hserial_Baud  = 2400 
Hserial_Clear = On  ' Bilgi alındığında tampon belleği temizle

Symbol GIE  =INTCON.7   'bütün interruptları aç-kapat
Symbol PEIE =INTCON.6   'donanımsal interruptları aç-kapat
Symbol RCIE =PIE1.5     'USART RX interrupt aç-kapat
Symbol RCIF =PIR1.5     'USART RX interrupt bayrağı

GIE=0   ; bütün kesmeleri kapat
RCIE=1  ; USART RX (alma) kesmesi açıldı
PEIE=1  ; Donanımsal kesmeler açıldı
GIE=1   ;Bütün kesmeler açıldı
........................
On_Interrupt GoTo INT
........................
Basla:
......................
HSerOut ["$","R","F",Bin ID,Bin ver,$45,$4E,$44,$0D,$0A]
.......................
INT:
    Context Save
    HSerIn 5,CIK,[Wait("$RF"),Bin AL] ; HSerOut ["$","R","F",Bin BILGI,$45,$4E,$44,$0D,$0A]
    temp=RCREG
    Context Restore
    
    Stop

Maxim

kodları en azından "derlenebilir" halde vermelisiniz, eksiklikler var
bu şekilde nerede ne yapıldığını anlayamayız

inventor

#2
Kumanda edilecek olan yazılım aşağıdaki gibidir:

Xtal=4
Device =16F876A
@ CONFIG_REQ 
@ __config CP_OFF & WDT_OFF & XT_OSC & LVP_OFF & BODEN_OFF & PWRTE_ON 

OPTION_REG=%00000000
ADCON1=%00000111


define Hserial_RCSTA = %10010000 ' Enable serial port & continuous receive
define Hserial_TXSTA = %00100000 ' Gönderim açık
define Hserial_Baud  = 2400 
define Hserial_Clear = On ' Clear overflow automatically

Symbol GIE  =INTCON.7   'bütün  interruptları açıyor
Symbol PEIE =INTCON.6   'hardware interruptları açıyor
Symbol RCIE =PIE1.5     'USART RX (Alma) interrupt aç-kapat
Symbol RCIF =PIR1.5     'USART RX (Alma) interrupt flag bit

GIE=0  
PEIE=1
RCIE=1   
GIE=1

TRISA=%11111111
TRISB=%00111111
TRISC=%10000011


Symbol BARA1     =PORTA.0  'probe suya değerse opamp çıkışı High, değilse Low
Symbol FAZ1      =PORTA.1 
Symbol TERMIK1   =PORTA.2 
Symbol YILDIZ1   =PORTA.3 
Symbol RUN1      =PORTA.4
Symbol EMNIYET   =PORTA.5
Symbol BARA2     =PORTB.0  'probe suya değerse opamp çıkışı High, değilse Low
Symbol FAZ2      =PORTB.1 
Symbol TERMIK2   =PORTB.2 
Symbol YILDIZ2   =PORTB.3 
Symbol RUN2      =PORTB.4
Symbol MOTOR1    =PORTB.6
Symbol MOTOR2    =PORTB.7 

Symbol AKIM1   =PORTC.0
Symbol AKIM2   =PORTC.1
Symbol RX_pin  =PORTC.7
Symbol TX_Pin  =PORTC.6

Dim Durum1 As Byte
Dim durum2 As Byte
Dim eski  As Byte 
Dim temp  As Byte 
Dim ID    As Byte  
Dim Onay  As Bit
Dim hata1  As Byte
Dim hata2  As Byte
Dim BILGI As Byte
Dim BOS2    As Bit
Dim I       As Byte
Dim a       As Byte
a=0

On_Interrupt GoTo INT
eski=0
Durum1=0
durum2=0
Onay=0
hata1=0
ID=0
MOTOR1=0
MOTOR2=0
RCIF=0
;***************************************  B A S L A  ****************************************************
Basla: 
If  EMNIYET=1 Then
    MOTOR1=0
    MOTOR2=0
EndIf

    ID=1-ID
If ID=0 Then 
    BILGI.0=ID
    BILGI.1=RUN1
    BILGI.2=YILDIZ1
    BILGI.3=BARA1
    BILGI.4=FAZ1
    BILGI.5=TERMIK1
    BILGI.6=EMNIYET
    BILGI.7=AKIM1
    HSerOut ["$","R","F",Bin BILGI,$45,$4E,$44,$0D,$0A]
EndIf
    I=0
    For I=0 To 100
    DelayMS 5
    I=I+1
    Next
If ID=1 Then 
    BILGI.0=ID
    BILGI.1=RUN2
    BILGI.2=YILDIZ2
    BILGI.3=BARA2
    BILGI.4=FAZ2
    BILGI.5=TERMIK2
    BILGI.6=EMNIYET
    BILGI.7=AKIM2
    HSerOut ["$","R","F",Bin BILGI,$45,$4E,$44,$0D,$0A]
EndIf
    I=0
    For I=0 To 100
    DelayMS 5
    I=I+1
    Next
;=======================================================  hata inceleme bölümü  =========================
If BARA1=0 And FAZ1=0 And TERMIK1=0 Then  hata1=0
If BARA1=1 Or FAZ1=1 Or TERMIK1=1 Then
    hata1=1  : MOTOR1=0 
EndIf
If BARA2=0 And FAZ2=0 And TERMIK2=0 Then  hata2=0
If BARA2=1 Or FAZ2=1 Or TERMIK2=1 Then
    hata2=1  : MOTOR2=0 
EndIf
;========================================= motor kontrol bölümü =============================

If Durum1=10 And hata1=0 And EMNIYET=0 Then ;MOTOR_1
    If durum2=10 Then MOTOR1=0  ;stop
    If durum2=20 Then MOTOR1=1  ;start
    Durum1=22
    durum2=22
EndIf

If Durum1=20 And hata2=0 And EMNIYET=0 Then ;MOTOR_2
    If durum2=10 Then MOTOR2=0  ;stop
    If durum2=20 Then MOTOR2=1  ;start    
    Durum1=22
    durum2=22
EndIf

GoTo Basla 

ATLA:
    Onay=1
    temp=RCREG
     RCIF=0
GoTo Basla
;=======================================  K E S M E  ==========================================

INT:  
    Context Save
    RCIF=0
    GIE=0
    While GIE=1
    GIE=0
    Wend
        HSerIn 5,ATLA, [Wait("$RF"),Bin Durum1,Bin durum2]   ;durum1= ID    durum2= start-stop
    If RCIF=1 Then 
        RCIF=0
        temp=RCREG
    EndIf
    Context Restore
    Stop     


Aşağıdaki programda kumanda sistemi için:
Device =16F876A
Xtal=4
@ CONFIG_REQ 
@ __config CP_OFF & WDT_OFF & XT_OSC & LVP_OFF & BODEN_OFF & PWRTE_ON 

OPTION_REG=%00000000
ADCON1=%00000111
INTCON=%10100000

Hserial_RCSTA = %10010000 ' seriport açık-veri alımı açık
Hserial_TXSTA = %00100000 ' Gönderim açık
Hserial_Baud  = 2400 
Hserial_Clear = On  ' Bilgi alındığında tampon belleği temizle

Symbol GIE  =INTCON.7   'bütün interruptları aç-kapat
Symbol PEIE =INTCON.6   'donanımsal interruptları aç-kapat
Symbol RCIE =PIE1.5     'USART RX interrupt aç-kapat
Symbol RCIF =PIR1.5     'USART RX interrupt bayrağı

GIE=0   ; bütün kesmeleri kapat
RCIE=1  ; USART RX (alma) kesmesi açıldı
PEIE=1  ; Donanımsal kesmeler açıldı
GIE=1   ;Bütün kesmeler açıldı

TRISA=%00011111
TRISB=%00000000
TRISC=%10000011
PORTA=0
PORTB=0
PORTC=0

LCD_DTPin       =PORTB.4    'LCD data portLARI NEREDE
LCD_RSPin       =PORTB.2      'LCD register select bit
LCD_ENPin       =PORTB.3    'LCD enable port
LCD_Interface   =4      'LCD bus size 4 or 8
LCD_Lines       =4      'Number lines on LCD
LCD_Type        =0
LCD_CommandUs   =2000
LCD_DataUs      =50
Print $fe,$40,16,24,28,30,28,24,16,0

Symbol START_1    =PORTA.0 
Symbol DUR_1      =PORTA.1
Symbol START_2    =PORTA.2 
Symbol DUR_2      =PORTA.3
Symbol MENU       =PORTA.4
Symbol RX_pin     =PORTC.7
Symbol TX_Pin     =PORTC.6

Dim X       As Byte
Dim I       As Byte 
Dim Konum   As Byte 
Dim ALINAN  As Byte  
Dim AL      As Byte 
Dim A       As Bit
Dim Koruma  As Bit
Dim Bilgi   As Word
Dim Durum   As Byte
Dim ver     As Byte
Dim hata1   As Bit
Dim hata2   As Bit
Dim temp    As Byte


Dim ID          As Byte
Dim BARA1       As Bit     
Dim FAZ1        As Bit      
Dim TERMIK1     As Bit 
Dim YILDIZ1     As Bit  
Dim RUN1        As Bit    
Dim BARA2       As Bit   
Dim FAZ2        As Bit 
Dim TERMIK2     As Bit   
Dim YILDIZ2     As Bit  
Dim RUN2        As Bit
Dim H           As Bit 
Dim EMNIYET     As Bit
Dim AKIM1       As Bit
Dim AKIM2       As Bit
Dim bh1         As Byte
Dim fh1         As Byte
Dim th1         As Byte
Dim bh2         As Byte
Dim fh2         As Byte
Dim th2         As Byte
Dim ah1         As Byte
Dim ah2         As Byte

DelayMS 35

On_Interrupt GoTo INT
ALINAN=0
Konum=0
Koruma=0
ver=0

If bh1>1 Or fh1>1 Or th1>1 Or bh2>1 Or fh2>1 Or th2>1 Then 
    bh1=0:fh1=0:th1=0:bh2=0:fh2=0:th2=0
EndIf
 A=0
Print  $FE,1 
DelayMS 30

Print At 1,1,"    YUKSEL DOGRUL   "
Print At 2,1,"  RADYO  FREKANSLI  "
Print At 3,1,"    MOTOR KONTROL   "
Print At 4,1,"      SISTEMI       "
DelayMS 1000
Print  $fe,1
Clear
;================================================  B A S L A   ===============================================================
Basla:

If MENU=0 Then 
    While MENU=0
    DelayMS 5
    Wend
    GoTo SORUN
EndIf

ID=AL.0
If ID=0 Then 
    RUN1    =AL.1
    YILDIZ1 =AL.2
    BARA1   =AL.3
    FAZ1    =AL.4
    TERMIK1 =AL.5
    EMNIYET =AL.6
    AKIM1   =AL.7
EndIf
If ID=1 Then 
    RUN2    =AL.1
    YILDIZ2 =AL.2
    BARA2   =AL.3
    FAZ2    =AL.4
    TERMIK2 =AL.5
    EMNIYET =AL.6
    AKIM2   =AL.7
EndIf 
If DUR_1=0 Then      ;stop 1 butonu
            While DUR_1=0
            DelayMS 5
            Wend
            ID=10
            ver=10
            HSerOut ["$","R","F",Bin ID,Bin ver,$45,$4E,$44,$0D,$0A]
        EndIf  
If START_1=0 And EMNIYET=0 Then
            While START_1=0
            DelayMS 5
            Wend
            ID=10
            ver=20
            HSerOut ["$","R","F",Bin ID,Bin ver,$45,$4E,$44,$0D,$0A]
        EndIf 
If DUR_2=0 Then      ;stop 2 butonu
            While DUR_2=0
            DelayMS 5
            Wend
            ID=20
            ver=10
            HSerOut ["$","R","F",Bin ID,Bin ver,$45,$4E,$44,$0D,$0A]
        EndIf  
If START_2=0 And EMNIYET=0 Then
            While START_2=0
            DelayMS 5
            Wend
            ID=20
            ver=20
            HSerOut ["$","R","F",Bin ID,Bin ver,$45,$4E,$44,$0D,$0A]
        EndIf                                                                        
 
 
 ID=AL.0
 
    If ID=0 Then MOTOR1
    If ID=1 Then MOTOR2

;===============================================  M O T O R 1   =================================================================
MOTOR1:
If BARA1=1 Or FAZ1=1 Or TERMIK1=1 Or AKIM1=1 Then 
    hata1=1
    GoTo EKRAN2
Else
    hata1=0
    GoTo EKRAN1
EndIf
                                              
;=================================================  E K R A N 1  ================================================================
EKRAN1:
If RUN1=0 And EMNIYET=0 Then
Print At 1,1,"1.MOTOR CALISIYOR   "
    If YILDIZ1=0 Then
        Print At 2,1,"YILDIZ BAGLANTI     "
    Else
        Print At 2,1,"                    "
    EndIf
EndIf
If RUN1=1 And EMNIYET=0 Then
Print At 1,1,"1.MOTOR DURDU       "
Print At 2,1,"                    "
EndIf
If  EMNIYET=1 Then
Print At 1,1,"1.MOTOR DURDU       "
Print At 2,1,"EMNIYET DEVREDE     "
EndIf

GoTo Basla
;=================================================  M O T O R 2  ================================================================
MOTOR2:
If BARA2=1 Or FAZ2=1 Or TERMIK2=1 Or AKIM2=1 Then 
    hata2=1
    GoTo EKRAN4
Else
    hata2=0
    GoTo EKRAN3
EndIf
;===============================================  E K R A N  3  =================================================================
EKRAN3:
If RUN2=0 And EMNIYET=0 Then
Print At 3,1,"2.MOTOR CALISIYOR   "
    If YILDIZ2=0 Then
        Print At 4,1,"YILDIZ BAGLANTI     "
    Else
        Print At 4,1,"                    "
    EndIf
EndIf
If RUN2=1 And EMNIYET=0 Then
Print At 3,1,"2.MOTOR DURDU       "
Print At 4,1,"                    "
EndIf
If  EMNIYET=1 Then
Print At 3,1,"2.MOTOR DURDU       "
Print At 4,1,"EMNIYET DEVREDE     "
EndIf
GoTo Basla
;=================================================  E K R A N 2  ============================================================
EKRAN2:
Print At 1,1,"1.MOTOR ARIZA       "
If BARA1=1 Then
Print At 2,1,"BARA GERILIMI YOK   "
EWrite 11,[BARA1]
GoTo Basla
EndIf
If FAZ1=1 Then
Print At 2,1,"FAZ KORUMA HATASI   "
EWrite 12,[FAZ1]
GoTo Basla
EndIf
If TERMIK1=1 Then
Print At 2,1,"TERMIK KORUMA       "
EWrite 13,[TERMIK1]
GoTo Basla
EndIf
If AKIM1=1 Then
Print At 2,1,"AKIM KORUMA HATASI  "
EWrite 14,[AKIM1]
GoTo Basla
EndIf
;=================================================  E K R A N 4  ============================================================
EKRAN4:
Print At 3,1,"2.MOTOR ARIZA       "
If BARA2=1 Then
Print At 4,1,"BARA GERILIMI YOK   "
EWrite 21,[BARA2]
GoTo Basla
EndIf
If FAZ2=1 Then
Print At 4,1,"FAZ KORUMA HATASI   "
EWrite 22,[FAZ2]
GoTo Basla
EndIf
If TERMIK2=1 Then
Print At 4,1,"TERMIK KORUMA       "
EWrite 23,[TERMIK2]
GoTo Basla
EndIf
If AKIM2=1 Then
Print At 4,1,"AKIM KORUMA HATASI  "
EWrite 24,[AKIM2]
GoTo Basla
EndIf
;===============================================  S O R U N  ================================================================
SORUN:
I=0
Print $fe,1
bh1=ERead 11
fh1=ERead 12
th1=ERead 13
ah1=ERead 14
bh2=ERead 21
fh2=ERead 22
th2=ERead 23
ah2=ERead 24

GoSub SORUN_EKRAN

For I=0 To 200 
If MENU=0 Then
    X=0
    For X=0 To 100
        If MENU=1 Then 
            Print  $fe,1
            GoTo Basla
        EndIf
    DelayMS 30   
    Next
    bh1=0:fh1=0:th1=0:bh2=0:fh2=0:th2=0

    EWrite 11,[BARA1]
    EWrite 12,[FAZ1]
    EWrite 13,[TERMIK1]
    EWrite 14,[AKIM1]
    EWrite 21,[BARA2]
    EWrite 22,[FAZ2]
    EWrite 23,[TERMIK2] 
    EWrite 24,[AKIM2]
    GoSub SORUN
    I=0
    X=0
    Print  $fe,1
    GoTo Basla
EndIf
DelayMS 100
Next
GoTo Basla
;=====================================================  S O R U N  E K R A N I  ===========================================
SORUN_EKRAN:
If ah1=1 Then 
Print At 1,1,0,"1.Akim  "
Else
Print At 1,1,0,"        "
EndIf

If bh1=1 Then 
Print At 2,1,0,"1.Bara  "
Else
Print At 2,1,0,"        "
EndIf

If fh1=1 Then 
Print At 3,1,0,"1.Faz   "
Else
Print At 3,1,0,"        "
EndIf

If th1=1 Then 
Print At 4,1,0,"1.Termik"
Else
Print At 4,1,0,"        "
EndIf

If ah2=1 Then 
Print At 1,12,0,"2.Akim "
Else
Print At 1,12,0,"       "
EndIf

If bh2=1 Then 
Print At 2,12,0,"2.Bara "
Else
Print At 2,12,0,"       "
EndIf

If fh2=1 Then 
Print At 3,12,0,"2.Faz  "
Else
Print At 3,12,0,"       "
EndIf

If th2=1 Then 
Print At 4,12,0,"2.Termik"
Else
Print At 4,12,0,"       "         
EndIf
Return
CIK:    
    Inc ALINAN
    If ALINAN=255 Then ALINAN=0 
    temp=RCREG
    RCIF=0
    GoTo Basla
;=================================================  K E S M E  =================================================================

INT:
    Context Save
       HSerIn 5,CIK,[Wait("$RF"),Bin AL] ; HSerOut ["$","R","F",Bin BILGI,$45,$4E,$44,$0D,$0A]
    temp=RCREG
    Context Restore
    
    Stop
     

ibrsel

Protonda kullandığım kesme alt programını vereyim..Belki işini görür..

''*************************************************************************
  
kesme:                                                               'kesme alt programı
    Context SAVE                                                 'kayıcıların içeriğini sakla
        HSerIn 1000,hata,[GelenBilgi]                    ' bilgiyi al "gelenbilgi"'değişkeninin içeriğine at, timeout olursa  '(1000 ms) "Hata" ya dallan        '
        Print At 1,1,"Gelen Deger ",dec3 GelenBilgi    'gelen bilginin değerini yazdır                       
        RCIF = 0                                                     'USART Receive interrupt Flag  Temizleniyor
    Context Restore                                             'tüm kyıtlı reg. tekrar yüklenip keseden çıkılıyor            
End                                                                     'program sonu

''*************************************************************************
hata:
    Print At 1,1,"Hata          "
Return 
''*************************************************************************

inventor

Aslında verdiğiniz bu kodlarla çalışması lazım ama olmuyor. Sayısız deneme yaptım diyebilirim. Acaba benim derleyicide mi sorun var? tuhaf olan şu ki; kırma bir program yazarsam sorunsuz çalışıyor. Kırma derken ayarları hw ye göre yapıp sw kesme kullanırsam demek istedim. Kısaca aklım çorba oldu :))
Mesela motor kısmındaki şu yazılım bu haliyle sorun çıkarmadan isiste çalışıyor:
Xtal=4
Device =16F876
@ CONFIG_REQ 
@ __config CP_OFF & WDT_OFF & XT_OSC & LVP_OFF & BODEN_OFF & PWRTE_ON 

OPTION_REG=%00000000
ADCON1=%00000111

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically


TRISA=%11111111
TRISB=%00111111


Symbol BARA1     =PORTA.0  'probe suya değerse opamp çıkışı High, değilse Low
Symbol FAZ1      =PORTA.1 
Symbol TERMIK1   =PORTA.2 
Symbol YILDIZ1   =PORTA.3 
Symbol RUN1      =PORTA.4
Symbol EMNIYET   =PORTA.5
Symbol BARA2     =PORTB.0  'probe suya değerse opamp çıkışı High, değilse Low
Symbol FAZ2      =PORTB.1 
Symbol TERMIK2   =PORTB.2 
Symbol YILDIZ2   =PORTB.3 
Symbol RUN2      =PORTB.4
Symbol MOTOR1   =PORTB.6
Symbol MOTOR2   =PORTB.7
 
Symbol Sifir   =PORTB.0
Symbol RX_pin  =PORTC.7
Symbol TX_Pin  =PORTC.6

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

Dim Durum1 As Byte
Dim durum2 As Byte
Dim eski  As Byte 
Dim temp  As Byte 
Dim ID    As Byte  
Dim Onay  As Bit
Dim hata1  As Byte
Dim hata2  As Byte
Dim BILGI As Byte
Dim BOS2    As Bit
Dim I       As Byte


PORTB=0

Sifir=0
DelayMS 300
Sifir=1
RCIE=1   
PEIE=1
GIE=1
On Interrupt GoTo INT
eski=0
Durum1=0
durum2=0
Onay=0
hata1=0
ID=0
;***************************************  B A S L A  ****************************************************
Basla: 
If  EMNIYET=1 Then
    MOTOR1=0
    MOTOR2=0
EndIf

    If ID=0 Then 
        ID=1
    Else
        ID=0
    EndIf  
If ID=0 Then 
    BILGI.0=ID
    BILGI.1=RUN1
    BILGI.2=YILDIZ1
    BILGI.3=BARA1
    BILGI.4=FAZ1
    BILGI.5=TERMIK1
    BILGI.6=EMNIYET
    BILGI.7=BOS2
    HSerOut ["$","R","F",Bin BILGI,$45,$4E,$44,$0D,$0A]
EndIf
    I=0
    For I=0 To 100
    DelayMS 5
    I=I+1
    Next
If ID=1 Then 
    BILGI.0=ID
    BILGI.1=RUN2
    BILGI.2=YILDIZ2
    BILGI.3=BARA2
    BILGI.4=FAZ2
    BILGI.5=TERMIK2
    BILGI.6=EMNIYET
    BILGI.7=BOS2
    HSerOut ["$","R","F",Bin BILGI,$45,$4E,$44,$0D,$0A]
EndIf
    I=0
    For I=0 To 100
    DelayMS 5
    I=I+1
    Next
;=======================================================  hata inceleme bölümü  =========================
If BARA1=0 And FAZ1=0 And TERMIK1=0 Then  hata1=0
If BARA1=1 Or FAZ1=1 Or TERMIK1=1 Then
    hata1=1  : MOTOR1=0 
EndIf
If BARA2=0 And FAZ2=0 And TERMIK2=0 Then  hata2=0
If BARA2=1 Or FAZ2=1 Or TERMIK2=1 Then
    hata2=1  : MOTOR2=0 
EndIf
;========================================= motor kontrol bölümü =============================

If Durum1=10 And hata1=0 And EMNIYET=0 Then ;MOTOR_1
    If durum2=10 Then MOTOR1=0  ;stop
    If durum2=20 Then MOTOR1=1  ;start
    Durum1=22
    durum2=22
EndIf

If Durum1=20 And hata2=0 And EMNIYET=0 Then ;MOTOR_2
    If durum2=10 Then MOTOR2=0  ;stop
    If durum2=20 Then MOTOR2=1  ;start    
    Durum1=22
    durum2=22
EndIf

GoTo Basla 
;=======================================  K E S M E  ==========================================
Disable
INT:
    GIE=0
    HSerIn 5,ATLA, [Wait("$RF"),Durum1,durum2]   ;durum1= ID    durum2= start-stop
    
ATLA:
    
    temp=RCREG
    GIE=1
    Resume
    Enable       


ibrsel

Vermiş olduğum kodları bilgisayar kontrollü  kayan yazı devremde dahil bir çok devremde kullandım..Yani sorunsuz çalışıyor..Sizde öncelikle proteusta "virtual terminal" i kullanarak PIC ile haberleşmeyi sağlayın..RX , TX bağlantılarını kontrol edin.. Bende ilk çalışmalarımda basit ama uzun uğraşlar sonucu bulduğum hatalar ile uğraşmıştım..

inventor

Dediğim gibi bir çok konfügürasyonu denedim. Artık sıkıldım açıkçası. Mümkünse son olarak konuya hakim bir arkadaşımız tanımlama ve kesme ayarlarını yazabilirse programı tekrar gözden geçirip sonlandırmak istiyorum. Oldu..oldu. Olmadı PBP ya devam edeceğim.
Sadece 16f876 ya HSEROUT komutu ile gönderilen bir komut RX pininden girdiği anda kesme oluşturacak ve gelen bilgiyi kaydedecek tanımlama ve kesme rutinine ihtiyacım var.
Herkese teşekkürler

Veli B.

Bir zamanlar böyle bir başlık oluşmuştu. Sanırım ihtiyacınız olan bilgi bu başlıktan çıkar...

https://www.picproje.org/index.php/topic,13027.msg85127/topicseen.html#msg85127

ibrsel

#8
HSERIN ve HSEROUT için örnek ugulama..Umarım işine yarar..

Seri bilgi 16F628 a ya bağlı olan buton ile gönderiliyor. Butona her basıldığında 2400 Baud ta "90" bilgisi hemen ardındanda boşluk bilgisi gönderiliyor..Alıcı taraf "90" bilgisini aldığında PORTA.0 a bağlı olan ledin durumunu değiştiriyor. Yani Yanık ise söndürüyor,sönük ise yakıyor
..İyi çalışmalar ...
...ibrsel...
devre şeması :

[IMG]http://hizliresimyukle.com/thumb-36295.jpg[/img]

Alıcı (16F876 için) Kod :

Device 16F876
 ALL_DIGITAL true
 TRISB=0 : PORTB=0
 TRISA=0 : PORTA=0
 ''************************************
 Declare LCD_DTPIN PORTB.4
 Declare LCD_RSPIN PORTB.2
 Declare LCD_ENPIN PORTB.3
 ''************************************
 ''**************************************************************
    on_interrupt GoTo kesme    'hardware kesmesi 
    HSERIAL_BAUD  = 2400       ' Seri iletişim hızı 9600 bPs
    HSERIAL_RCSTA = %10010000  ' seriport açık ve alıma herzaman açık
    HSERIAL_TXSTA = %00100000  ' GÖNDERİM AÇIK
    HSERIAL_CLEAR = On         ' bilgi alındığında Tampon belleği temizle  
 Symbol PEIE = INTCON.6     ' Peripheral Interrupt Enable
 Symbol GIE  = INTCON.7     ' Global Interrupt Enable
 Symbol RCIE = PIE1.5       ' USART Receive Interrupt yetki
 Symbol RCIF = PIR1.5       ' USART Receive Interrupt bayrağı
        GIE= 0  'tüm kesmeler kapalı 
        PEIE=1  'Çevre birim kesmesi aktif
        RCIE=1  'Usart alım kesmesi aktif 
        GIE= 1  'tüm kesmeler aktif
''**************************************************************
Dim gelenbilgi As Byte
Dim i As Byte
''--------------------------------------------------------------
basla:
    For i=0 To 20
        Print At 1,i,"#"
        DelayMS 50
    Next i
    Print At 1,1,"                "
GoTo basla
''--------------------------------------------------------------

''*************************************************************************
kesme:                                                  
    Context SAVE
        HSerIn 1000,hata,[gelenbilgi]         
        Print At 2,1,"Gelen=",DEC3 gelenbilgi
            If gelenbilgi=90 Then Toggle PORTA.0           
        RCIF = 0                       
    Context Restore                                     
End                                                                  

''*************************************************************************
hata:
    Print At 1,1,"Hata          "  
    DelayMS 1500
    Cls
    GoTo basla  
Return 
''*************************************************************************


VErici (16F628A) için Kod :

Device = 16F628A
 Config XT_OSC, WDT_OFF , PWRTE_OFF , BODEN_OFF , LVP_OFF , MCLRE_OFF 
 XTAL = 4                  
        HSERIAL_BAUD  = 2400                ' Seri iletişim hızı 2400 bPs
        HSERIAL_RCSTA = %10010000  ' seriport açık ve alıma herzaman açık
        HSERIAL_TXSTA = %00100000  ' GÖNDERİM AÇIK
        HSERIAL_CLEAR = On         ' bilgi alındığında Tampon belleği temizle  
 '*************************************************************************** 
  Dim i As Byte
  i=0
''--------------------------------------------------------------
basla:
    If PORTB.0=1 Then
        HSerOut [90]  : DelayMS 50
        HSerOut [" "] : DelayMS 750
    EndIf

GoTo basla
''--------------------------------------------------------------

inventor

Alıntı yapılan: katana - 12 Şubat 2011, 13:37:59
Bir zamanlar böyle bir başlık oluşmuştu. Sanırım ihtiyacınız olan bilgi bu başlıktan çıkar...

https://www.picproje.org/index.php/topic,13027.msg85127/topicseen.html#msg85127
link için Teşekkürler Katana. Dikkatli bir şekilde inceledim. Bildiklerimin haricinde bir bilgiye ulaşamadım. Sanırım bildiğim bir konuyu protonda yanlış kullanıyorum. Yazdığım program proteusta çalışıyor ama pcb de çalışmıyor. Bana tasarım hatası v.b gibi bir şeyle söylemeyin lütfen. Her ne oluyorsa proteus bunu es geçiyor ama gerçek uygulamada çalışmıyor. Aynı pcb için PBP gönderme alma kodları ile haberleşebiliyorum. LCD ye yazılar yazabiliyorum ya da röleleri çektirebiliyorum. Demek ki sorun protondaki yazdığım programda diye düşünüyorum. İstemeniz durumunda programı ve isis şemasını gönderebilirim.

Sayın ibrsel,ilginiz için sizede teşekkür ederim. Dediğim gibi proteusta çalışan ama reelde çalışmayan bir programla uğraşıyorum. Sizin kullandığınızdan farklı bir uygulamam olmadı ama çalışmadı.

Hattusa

s.a.
arkadaşlar 18f4520 ile harici bir frekans kaynağından (100hertz civarı) portB.0 girişi aldım, amacım harici frekansın yükselen kenarını yakalayıp, ona göre ilgili pinleri aktif etmek ve adc okutmak istiyorum, ne var ki bir türlü bunu başaramadım,
bana yardım edermisiniz?
[IMG]http://www.yukleresim.com/images/01286490972312763686.bmp[/img] Yukleresim.com
vardım ilim meclisine eyledim talep, meğer ilim en gerideymiş illa EDEP, illa EDEP <muhyiddin Arabi K.S.>

Hattusa

#11
s.a.
arkadaşlar bu konu hakkında yardımcı olacak bir arkadaş yokmu?

vardım ilim meclisine eyledim talep, meğer ilim en gerideymiş illa EDEP, illa EDEP <muhyiddin Arabi K.S.>

Maxim

bu şekilde yok..

önce yaptıklarını görelim, kod gibi mesela ?
ayrıca çalışan bir proteus devresi gibi mesela ?


not:
yanlışlıkla yukarıdaki mesajını editlemişim, değişiklik yoktur.

Hattusa

S.A.
haklısınız ustam bazen dikkatimizden kaçıyor,
şimdi ekte isis şemasını ekliyorum ve yazılım ile ilgili bas dosyasınıda ekliyorum, benim istediğim, harici 100 hertzlik kare frekansın yükselen kenarını algılamak ve programım algıladıktan 200uS sonra adc okutmak ve pini aktif etme işini yapmak istiyorum, kodda bir eksiklik var çözemedim, portb.0 da değişikliği yakalıyorum ama istediğim noktada yani yükselen kenarda işlemleri yapamıyorum, işlemler kafasına göre yapıyor,
yardımcı olursanız memnun olurum.

http://hotfile.com/dl/114169423/adbf249/DIGITAL.DSN.html

;-------------------------- Common settings ------------------------------------
                                                                   
Device = 16F877A   ' Selected PICMicro
Xtal 20   ' Oscillator frequency  20 MHz                                                           
'
                                                               
Declare Adin_Res 10   ' Sets the number of bits in the result
Declare Adin_Tad 32_Fosc  ' Sets the ADC's clock source
'Declare Adin_Stime 10   ' Allows the internal capacitors to fully charge                                                                  
'-------------------------- LCD connection settings ------------------------                                                                  
Declare  LCD_Type ALPHA   ' Alphanumeric LCD type
Declare  LCD_DTPin  PORTD.4   ' LCD data port
Declare  LCD_ENPin  PORTD.3   ' E line
Declare  LCD_RSPin  PORTD.2   ' RS line
Declare  LCD_Interface  4   ' 4-line or 8-line interface
Declare  LCD_CommandUs  200   ' Time to wait (in uS) between commands sent to the LCD
Declare  LCD_DataUs  100   ' Time to wait (in microseconds) between data sent to the LCD
Declare  LCD_Lines   4   ' How many lines the LCD has
'-------------------ADCON1 KURULUMU-----------------------------------       
ADCON1 = %10000100
ADCON0.0=1
'---------------KESME AYARLARI ------------------------
On Interrupt GoTo kEsIm
OPTION_REG=%11000000 
Symbol INTF =INTCON.1
Symbol INTE= INTCON.4
Symbol GIE =INTCON.7
INTCON.3=1
INTCON.6=1
GIE=1
INTE=1                    
'-------------------------- Ports settings ---------------------------------
TRISA = %01101111 :PORTA = 0
TRISB = %00000001 :PORTB = 0
TRISC=  %00000000 :PORTC = 0
TRISD = %00000000 :PORTD = 0
TRISE = %00000001 :PORTE = 0
'-------------------------- Symbols -----------------------------                                                               
Dim OrN_1 As PORTC.1 
Dim KeSme As PORTB.0
'-----------------------------VOLTAJ OKUMA----------------------------------------------
Dim vOlT1 As Float :Dim VoLt2 As Float :Dim bAtArYa As Float :Dim X As Byte
'---------------------------BARGRAF-----------------------
Dim i As Byte
'-------------------------- Variables --------------------------- 
'------------ADC ölçüm değişkenleri-----------------------------                                                        
Dim AdCoKU  As     Word    'ADC ölçümü
'-------------------------diğer değişkenler------------------------------

 '---------------------------DEGISKENLERe atanan ön değerler---------------------------
Input PORTB.0

EkRaN:
Print At 1,1,"DENEME"
Print At 1,15,"BAT:"
Print At 1,20,"V"

MaIn:
PORTC.7=1
Print At 2,1,Dec AdCoKU
VoLt2= vOlT1 *0.054
If VoLt2 < 10   Then
Print At 1,11, "BAT:ZAYIF"
Else
Print At 1,15,Dec2 VoLt2
EndIf
PORTC.7=0
GoTo MaIn



'--------------------------------------KESME----------------------------------
Disable
kEsIm:
DelayUS 200
OrN_1=1
DelayUS 5
AdCoKU = ADIn 1
DelayUS 10
OrN_1=0
DelayUS 5
vOlT1 = ADIn 0
DelayUS 10
INTF=0
Resume
Enable
End
vardım ilim meclisine eyledim talep, meğer ilim en gerideymiş illa EDEP, illa EDEP <muhyiddin Arabi K.S.>

gutaussehender

Alıntı yapılan: pro-TR - 12 Nisan 2011, 10:29:46
s.a.
arkadaşlar bu konu hakkında yardımcı olacak bir arkadaş yokmu?

INTCON2.6=0 ' rb0 dusen kenar kesmesı 1 olursa yukselen kenar
INTCON=%10010000 ' rb0 kesmesi aktif

şeklinde olmalı.