SERİ İLETİŞİMİ KESME İLE KONTROL

Başlatan KAYALARLI, 01 Eylül 2015, 13:49:58

KAYALARLI

iki adet 16f628a pic kullanmaktayım.
1. pic veri gönderiyor,
2. pic veriyi alıyor, gelen bilgiye göre işlem yürütüyor.
Herşey gayet güzel çalışıyor.
SEROUT2
SERIN2  komutlarıyla veriyi gönderiyor alıyorum.

2. pic veri almak için sürekli ana döngü içersinde veri almaya çalışıyor.
Bu veri gönderme alma işini ilgili kesmeye dahil etmek istiyorum.
INTCON=%11110000   yazmacının dış harici kesmeler bitini 1 yapmam gerektiğini biliyorum.
PIE1.? YAZMACINDA  SERIN2  SEROUT2 bilgi alışverişi için hangi biti 1 yapmalıyım.
PIR1.? ilgili bitin bayrak yönetimi olduğunu biliyorum. Kesme oluşursa 1 haline geçer. Yeniden kesmenin oluşması için kesme alt programının bitiminde 0 yaparım.

Bilgi gönderme işini ve bilgi alma işini bir kesmeye dahil ederseniz sevinirim.
TMR0 ve BO kesmelerini başka iş  ve işlemler için kullanıyorum. Bu kesmeler dışında
PIE1 yazmacıyla yönetilen bir kesmeye dahil etmeniz, arzumdur.
Şimdiden Teşekkür ederim.

VERI GONDEREN KODUM
PORTA=0:portb=0
TRISB=%00000001 
TRISA=%00011110 
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
OPTION_REG= %00000101   
INTCON=%10110000 
CMCON=7    '16F628
'-------------------------------------------------------------------------------
DEFINE LCD_RSREG   PORTB      'lcd rS bacağı nereye bağlı
DEFINE LCD_RSBIT   1         ' RS   PortB.4
DEFINE LCD_RWREG   PORTB      'lcd rW bacağı nereye bağlı
DEFINE LCD_RWBIT    2
DEFINE LCD_EREG       PORTB      'lcd E bacağı nereye bağlı
DEFINE LCD_EBIT     3
DEFINE LCD_DREG      PORTB      'LCD data pinleri nereye bağlı
DEFINE LCD_DBIT      4         'lcd data pinleri hangi bitten başlıyor.
DEFINE LCD_BITS      4         'lcd kaç bit çalışacak.
DEFINE LCD_LINES   4         'lcd kaç SATIR.
INCLUDE "MODEDEFS.BAS"
'---------Değişken tanımlamaları-----------------------------
saat   var      byte      ' Saat değişkenini tanımlar
dakika   var      byte         ' Dakika değişkenini tanımlar
saniye   var      byte         ' Saniye değişkenini tanımlar
TMR0_Say   var   byte         ' Timer0 kesmelerini sayma değişkeni
Guncelle   var   byte         ' LCD güncelleme değişkeni
sure var byte
sayac var word
i var byte         ' Ark söndürme döngüsü
rlsec var byte
dvrno var byte
rlbul var byte
VER var byte
menude var byte
'------------------------------------------------------------
SYMBOL CIKIS=PORTA.0
SYMBOL ARTIR=PORTA.1
SYMBOL AZALT=PORTA.2
SYMBOL MENU=PORTA.3
SYMBOL KACJ=PORTA.4
VER = 0
saat = 0                     ' Zamanı ilk çalışma durumuna ayarla.
dakika = 0
saniye = 0
TMR0_Say = 0
Guncelle = 1               ' LCD güncelleme bayrağı aktif
rlsec = 1
dvrno = 1
menude = 0
ON INTERRUPT Goto TMR0_Kesme 'Kesme olduğunda   TMR0_KESME alt programına git.
Read 15, sure
   if sure = $FF then
      sure = 1
      write 15, sure
   endif
Read 16, sayac
   if sayac = $255 then
      sayac = 0
      write 16, sayac
   endif
Pause   100                  ' LCD'nin açılmasını bekle.
'------------------ Ana program döngüsü- --------------------
Ana_dongu:    
   if ver = 2 then gonder
    if ver = 1 then gonderir   
   If ARTIR = 1 Then sure_arttir
   If AZALT = 1 Then sure_azalt
   IF KACJ = 1 Then syc_gos
   If MENU = 1 Then ANAMENU
Kontrol:  ' LCD güncellemesi zamanı geldi mi? Kontrol et
   If guncelle = 1 Then
      Lcdout $fe, 1         ' Ekranı sil
         LCDOUT $FE,$C1,dec2 saat, ":", dec2 dakika, ":", dec2 saniye,REP 32\6             
            lcdout $FE,$95, #SURE, " DAKIKA 1 TL",REP 32\6
      if saniye = 0 and saat > 0 and dakika = 0 then
         saat = saat - 1
         dakika = 60
      endif
            if dakika > 0 and saniye = 0 then
               dakika = dakika -1
               saniye = 60
            endif
      guncelle = 0         ' Ekran güncellendi
   Endif
Goto Ana_dongu               ' Ana programla sonsuz döngü sağla
'--------ARTIR BOLUMU---------------
gonderir:   
ver = 3
menude = 0
goto ark_sondur
gonder:   
ver = 4
goto ark_sondur
   
sure_arttir:
   sure = sure + 1
   If sure > 60 Then 
      sure = 1
   Endif
   write 15, sure
   guncelle = 1
for i = 1 to 25
pause 10
next i
goto kontrol
'--------AZALT BOLUMU---------------   
sure_azalt:   
   sure = sure - 1
   If sure = 0 Then 
   sure = 60
   Endif
   write 15, sure
guncelle = 1
for i = 1 to 25
pause 10
next i
goto kontrol
'--------KACJ BOLUMU---------------   
syc_gos:
   read 16, sayac
   Lcdout $fe, 1         ' Ekranı sil
      Lcdout dec2 saat, ":", dec2 dakika, ":", dec2 saniye
      LCDOUT $FE, $C0, "SAYAC ", #SAYAC   
guncelle = 1
for i = 1 to 25
pause 10
next i
goto kontrol      
'------------ sıfırlama bolumu-------------------------
sifirla:
    menude = 0
   saat = 0
   dakika = 0
   saniye = 0
   VER = 0
goto ark_sondur
'--------Ark söndürme ve 250 mS gecikme bölümü---------------
ark_sondur:
For i = 1 to 10
        SEROUT2 CIKIS,396,["S","R","N",VER]
      SEROUT2 CIKIS,396,["R","L","B",rlbul]
      SEROUT2 CIKIS,396,["R","L","G",dvrno]   
Next i               ' böylece hiçbir kesme kaçırılmaz.   
guncelle = 1         ' Ekran güncellemesi aktif.
menude = 5
Goto Kontrol   
'--------ANAMENU BOLUMU---------------   
ANAMENU:
menude = 1
ROLE_SEC:         
     If KACJ = 1 Then sifirla
       LCDOUT $FE,$82,"ROLE DAVRANISI"
       LCDOUT $FE,$C1,"ROLE SEC  : ", #rlsec
         LCDOUT $FE,$0E:LCDOUT $FE,$10:PAUSE 120
       LCDOUT $FE,$0C:LCDOUT $FE,$10:PAUSE 120   
       gosub neyazar
       rlbul = rlsec + 20
       read rlbul, dvrno
        gosub neyazar
         lcdout $FE,$D5,"KAYDET"
         IF ARTIR=1   THEN
         LCDOUT $FE,1
         if rlsec >= 12 then
         rlsec = 0
         endif
          rlsec = rlsec + 1
       endif
         IF AZALT=1 THEN
         if rlsec > 1 then
            LCDOUT $FE,1
            rlsec = rlsec - 1
         endif
       endif
       IF MENU=1 THEN DAVRANIS_SEC
      goto ROLE_SEC
DAVRANIS_SEC:         
       gosub neyazar
       PAUSE 120
       LCDOUT $FE,$0E:LCDOUT $FE,$10:PAUSE 120
       LCDOUT $FE,$0C:LCDOUT $FE,$10:PAUSE 120
         lcdout $FE,$D5,"KAYDET"
         IF ARTIR=1 THEN
         if dvrno >= 12 then
         dvrno = 0
         endif
          dvrno = dvrno + 1
       endif
         IF AZALT=1 THEN
         if dvrno > 1 then
            dvrno = dvrno - 1
         endif
       endif
       IF MENU=1 THEN DVR_KAYIT
      goto DAVRANIS_SEC    
DVR_KAYIT:    
         lcdout $FE,$D5,"KAYDET"
       LCDOUT $FE,$0E:LCDOUT $FE,$10:PAUSE 120
       LCDOUT $FE,$0C:LCDOUT $FE,$10:PAUSE 120
       IF MENU=1 THEN
       write rlbul, dvrno
       gosub sifirla
       endif
     goto DVR_KAYIT
neyazar :
      select case dvrno
      case 1
      lcdout $FE,$95,"DVRNS SEC :Makine--"
      case 2
      lcdout $FE,$95,"DVRNS SEC :Kilit Ac"
      case 3
      lcdout $FE,$95,"DVRNS SEC :PC RST--"
      case 4
      lcdout $FE,$95,"DVRNS SEC :Kilit Of"
      case 5
      lcdout $FE,$95,"DVRNS SEC :PC SHUT-"
      case 6
      lcdout $FE,$95,"DVRNS SEC :P BEKLE-"
      case 7
      lcdout $FE,$95,"DVRNS SEC :GECE----"
       case 8
      lcdout $FE,$95,"DVRNS SEC :GUNDUZ--"
      case 9
      lcdout $FE,$95,"DVRNS SEC :DAIMI---"
      case 10
      lcdout $FE,$95,"DVRNS SEC :SR SONRA"
      case 11
      lcdout $FE,$95,"DVRNS SEC :SR ONCE-"
      case 12
      lcdout $FE,$95,"DVRNS SEC :SINYAL--"
      end select
RETURN   
'--------'Her TMR0 kesmesinde işleyen alt program------------
DISABLE      ' Kesme alt programında kesmeler iptal.
TMR0_Kesme:
if INTCON.2 = 1 THEN   
   TMR0_Say = TMR0_Say + 1      ' TMR0 kesmelerini say
   If TMR0_Say < 61 Then Kesme_sonu   ' 61x16.384 mS=1 Sn
      TMR0_Say = 0
      if saniye > 0 then   
      menude = 0
      saniye = saniye -1
        endif
      if menude = 1 then
      guncelle = 0
      else
        guncelle = 1      ' LCD güncellemesi aktif.
      endif
      if saat = 0 and dakika = 0 and saniye = 0 and menude = 0 then
            Lcdout $fe, 1         ' Ekranı sil
            LCDOUT $FE,$C1,"1 TL ATINIZ",REP 32\6             
                lcdout $FE,$95, #SURE, " DAKIKA 1 TL",REP 32\6
            ver = 2
            guncelle = 0
       endif
endif      
if INTCON.1 = 1 THEN 
    sayac = sayac + 1
   Read 15, sure
   dakika = dakika + sure
   If dakika >= 60 Then 
      dakika = (dakika // 60)
      saat = saat + 1
    Endif
    write 16, sayac
   ver = 1
endif   
'-----TMR0 Kesme alt programından çıkış bölümü --------
Kesme_sonu: 
   INTCON.2 = 0      ' Timer0 kesme bayrağını sıfırla.
   INTCON.1 = 0      ' Timer0 kesme bayrağını sıfırla.   
   Resume               ' Alt programdan çık
   ENABLE               ' Kesmeleri tekrar geçerli yap.
   End
'------------------------------------------------------------
'------------------------------------------------------------
'------------------------------------------------------------
'------------------------------------------------------------
VERİYİ ALAN KODUM
PORTA=0:portb=0
TRISB=%00000000 'PortB tamamı giriş yapıldı.
TRISA=%00000001  'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
OPTION_REG= %00000101    'dahili Pull up dirençleri aktif edildi ayrıca pullup direncine gerek yok.
INTCON=%10100000  'Kesmeler aktif ve RB0/INT kesmesi aktif
CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'-------------------------------------------------------------------------------
'------------------------------------------------------------
INCLUDE "MODEDEFS.BAS"      
guncelle var byte
rstsay var byte
rstsay = 0
knt var byte[13]
roleney var byte
rlggrv var byte
i var byte
AL VAR byte
rlbal var byte
rlgal var byte
SYMBOL GIRISK=PORTA.0
SYMBOL rly1 = PORTA.1
SYMBOL rly2 = PORTA.2
SYMBOL rly3 = PORTA.3
SYMBOL rly4 = PORTA.4
SYMBOL rly5 = PORTB.0
SYMBOL rly6 = PORTB.1
SYMBOL rly7 = PORTB.2
SYMBOL rly8 = PORTB.3
SYMBOL rly9 = PORTB.4
SYMBOL rly10 = PORTB.5
SYMBOL rly11 = PORTB.6
SYMBOL rly12 = PORTB.7
pause 100
guncelle = 1
ON INTERRUPT Goto rstkesme
'------------------------------------------------------------
ANAPRG:
rlbal = 0 : rlgal = 0 : rlggrv = 0 : roleney = 0 : AL = 0    
SerIn2 GIRISK,396,[WAIT ("SRN"),AL]
SerIn2 GIRISK,396,[WAIT ("RLB"),rlbal]
SerIn2 GIRISK,396,[WAIT ("RLG"),rlgal]
pause 100
if rlbal > 0 and rlgal > 0 then
   write rlbal, rlgal
   AL = 4
   endif
if AL = 3 THEN
   gosub grvbir
   endif
if AL = 4 THEN
   gosub grvbirson
   endif
if knt[2] = 1 THEN
   gosub grviki
   endif
if knt[3] = 1 and knt[1] = 0 then
      for rstsay = 0 to 300
         goto grvuc
      next rstsay
endif   
goto ANAPRG
'------------------------------------------------------------

'------------------------------------------------------------
grvbir:
for i = 21 to 32
read i, rlggrv
roleney = i - 20
   select case rlggrv
   case 1
      knt[1] = 1
      select case roleney
      case 1
      HIGH rly1
      case 2
      HIGH rly2
      case 3
      HIGH rly3
      case 4
      HIGH rly4
      case 5
      HIGH rly5
      case 6
      HIGH rly6
      case 7
      HIGH rly7
      case 8
      HIGH rly8
      case 9
      HIGH rly9
      case 10
      HIGH rly10
      case 11
      HIGH rly11
      case 12
      HIGH rly12      
      end select
   case 2
      knt[2] = 1
   case 3
      knt[3] = 1
   case 4
      knt[4] = 1
   case 5
      knt[5] = 1
   case 6
      knt[6] = 1
   case 7
      knt[7] = 1   
   case 8
      knt[8] = 1
   case 9
      knt[9] = 1
   case 10
      knt[10] = 1
   case 11
      knt[11] = 1
   case 12
      knt[12] = 1      
   end select            
next i    
RETURN
'------------------------------------------------------------
grvbirson:
rstsay = 0
knt[1] = 0
for i = 21 to 32
read i, rlggrv
roleney = i - 20
   select case rlggrv
   case 1
      select case roleney
      case 1
      LOW rly1
      case 2
      LOW rly2
      case 3
      LOW rly3
      case 4
      LOW rly4
      case 5
      LOW rly5
      case 6
      LOW rly6
      case 7
      LOW rly7
      case 8
      LOW rly8
      case 9
      LOW rly9
      case 10
      LOW rly10
      case 11
      LOW rly11
      case 12
      LOW rly12
      end select
   end select            
next i    
RETURN
'------------------------------------------------------------
grviki:
knt[2] = 0
for i = 21 to 32
read i, rlggrv
roleney = i - 20
   select case rlggrv
   case 2
      select case roleney
      case 1
      HIGH rly1
      pause 300
      LOW rly1
      case 2
      HIGH rly2
      pause 300
      LOW rly2
      case 3
      HIGH rly3
      pause 300
      LOW rly3
      case 4
      HIGH rly4
      pause 300
      LOW rly4
      case 5
      HIGH rly5
      pause 300
      LOW rly5
      case 6
      HIGH rly6
      pause 300
      LOW rly6
      case 7
      HIGH rly7
      pause 300
      LOW rly7
      case 8
      HIGH rly8
      pause 300
      LOW rly8
      case 9
      HIGH rly9
      pause 300
      LOW rly9
      case 10
      HIGH rly10
      pause 300
      LOW rly10
      case 11
      HIGH rly11
      pause 300
      LOW rly11
      case 12
      HIGH rly12   
      pause 300
      LOW rly12      
      end select
   end select            
next i    
RETURN
'------------------------------------------------------------
grvuc:
knt[3] = 0
for i = 21 to 32
read i, rlggrv
roleney = i - 20
   select case rlggrv
   case 3
      select case roleney
      case 1
      HIGH rly1
      pause 1000
      LOW rly1
      case 2
      HIGH rly2
      pause 1000
      LOW rly2
      case 3
      HIGH rly3
      pause 1000
      LOW rly3
      case 4
      HIGH rly4
      pause 1000
      LOW rly4
      case 5
      HIGH rly5
      pause 1000
      LOW rly5
      case 6
      HIGH rly6
      pause 1000
      LOW rly6
      case 7
      HIGH rly7
      pause 1000
      LOW rly7
      case 8
      HIGH rly8
      pause 1000
      LOW rly8
      case 9
      HIGH rly9
      pause 1000
      LOW rly9
      case 10
      HIGH rly10
      pause 1000
      LOW rly10
      case 11
      HIGH rly11
      pause 1000
      LOW rly11
      case 12
      HIGH rly12   
      pause 1000
      LOW rly12      
      end select
   end select            
next i    
goto ANAPRG
'-------- ------------
DISABLE      
rstkesme:
   
   INTCON.2 = 0      
   Resume               
   ENABLE               
   End




KAYALARLI


16f628A için TMR0 ve USART kesmesi birlikte kullanımı
başlıklı konuyu okudum  ve uygun kesmeyi kullandım.
sorun çözüldü teşekkür ederim.

INTCON=%11110000
PIE1.5 = 1
PIR1.5 = 0

usart kesmesi imiş kullandım oldu.

Powered by EzPortal