D

PC'den programlanan Haftalık Fabrika vardiya zili devresinde alarm problemi

Başlatan digiland, 21 Haziran 2013, 19:57:20

digiland

Yapmış olduğum devre RS232 ile bilgisayara bağlanarak; hangi gün hangi saatlerde kaç saniyelik zil çaldıracağı programlanabilen bir projedir.

burada programlanan zil çalma zamanı geldiği zaman proje bazen 20-30sn erken çalmaya yada 20-30 sn geç çalmaya başlıyor.

devrenin similasyon çizimini, pcb için isis tasarımını ve kodlarını ekliyorum.. eğer farklı bir gözle inceleyebilirseniz.. hatamı bulabileceğime inanıyorum..

şimdiden emeğinize sağlık.. 


'****************************************************************
'*  Name    : ZIL_kontrol.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2010 [OBITECH ILERI TEKNOLOJI]      *
'*          : All Rights Reserved                               *
'*  Date    : 14.02.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

'device 18f452
DEVice 16f877a
ADCON1=7
delayms 500


XTAL = 20
LCD_DTPIN = PORTd.4
LCD_RSPIN = PORTd.3
LCD_ENPIN = PORTd.2
LCD_INTERFACE = 4 ' 4-bit Interface
LCD_LINES = 2
LCD_TYPE = 0

HSERIAL_BAUD = 9600        ' Set baud rate to 9600
HSERIAL_RCSTA = %10010000  ' Enable serial port and continuous receive
HSERIAL_TXSTA = %00100100  ' Enable transmit and asynchronous mode
HSERIAL_CLEAR = ON 


symbol RtC_ClK      = portb.0      zil devresi tanımlayıcısı
symbol RtC_RsT      = portb.2
symbol RtC_DtA      = portb.1

'symbol RtC_ClK      = porta.0     'bardod okuyucu
'symbol RtC_RsT      = porta.2
'symbol RtC_DtA      = porta.1


symbol RoLe         = portc.0
symbol InDiKtOr     = portc.1
SYMBOL AlArMOn      = portc.2


    dim MeM         as byte
    Dim SaYi        as byte
    dim SaNiYe      as byte
    dim DakikA      as byte
    dim SaaT        as byte
    dim GunSirasi   as byte
    dim Gun         as byte
    dim Ay          as Byte
    dim YiL         as byte
    dim KonTroL     as byte
    dim OnlaR       as byte
    dim BiRleR      as byte
    dim Eski_Sn     as byte
   
    dim i           as byte
    dim a           as byte
    dim StaR        as byte
    dim KoMuT[32]   as byte
    Dim TmKomut[32] as byte
    dim SMeM[4]     as byte
   
    dim BeLLek      as word
    dim SuRe        as byte
    dim OaLaRM[16]  as byte
    dim ASaaT       as byte
    dim ADaKiKa     as byte
    Dim AGuNSiraSi  as byte
    dim ASaBit      as byte
   
    dim AlaRm_bas   as byte
   
    Dim Led         as byte
    dim GunAdi[32]  as byte

high indiktor   
' delayms 1000   
' High role
' delayms 1000   
' high alarmon
' low role
' delayms 1000
low alarmon

'bu alan test icin
cls
' print at 1,1,"hazir"
High portb.1
' HSEROUT ["Hazir versiyon 125",13,10]   
    i = 0
    a = 0
star = $a
led  = 0
bellek = 0
low role
'low indiktor
' gosub zaman_oku

' 'burası saati ekrana basmak için eklendi...
'     hserout ["$",dec2 saat,":",dec2 dakika,":",dec2 saniye,"  ",dec2 gun,"/",dec2 ay,"/","20",dec2 yil,"@",13,10]
'     delayms 200
 
BasLa:
     gosub zaman_oku
     gosub alarmvarmi
goto basla

SiFiRLa:
tmkomut[0] = 0
komut [0]  = 0
star = 0
return


Zaman_Oku:
    High RtC_RsT
    OUTPUT rtc_dta
    shout RtC_DtA ,RtC_ClK ,0 ,[$BF]
    INPUT RTC_DTA
    shin  RtC_DtA ,RtC_ClK ,1 ,[saniye\8,dakika\8,saat\8,gun\8,ay\8,gunsirasi\8,yil\8,kontrol\8]
   
    Low RtC_RsT

         mem=saniye     :gosub cevir:saniye=sayi 
         mem=dakika     :gosub cevir:dakika=sayi
         mem=saat       :gosub cevir:saat=sayi
         mem=gun        :gosub cevir:gun=sayi
         mem=ay         :gosub cevir:ay=sayi
         mem=yil        :gosub cevir:yil=sayi
         mem=gunsirasi  :gosub cevir:gunsirasi=sayi
         if led != saniye then
            toggle indiktor
            led = saniye
         endif   
return       


'***********Hex Değer Binary dönüşüyor**************

TersCevir:
    onlar=mem dig 1
    onlar=onlar<<4
    birler=mem dig 0
    sayi=onlar + birler
return

'**********Binary Değer Hex Dönüşüyor***************
Cevir:
    onlar   =mem & %01110000
    onlar   =onlar>>4
    birler  =mem & %00001111
    sayi    =onlar * 10 + birler
RETURN
'**************** **********************************
'CSggaa yyssd dssG        G=haftanın kaçıncı günü.

ZaMaN_AyArLa:
    str smem = tmkomut[12],tmkomut[13],0
    mem = Val (smem,Dec)
Gosub Terscevir    :Saniye=SAYI

    str smem = tmkomut[10],tmkomut[11],0
    mem = Val (smem,Dec)
Gosub Terscevir    :Dakika=SAYI

    str smem = tmkomut[8],tmkomut[9],0
    mem = Val (smem,Dec)
Gosub Terscevir    :Saat=SAYI

    str smem = tmkomut[14],0
    mem = Val (smem,Dec)
GOSUB terscevir    :gunsirasi=sayi

    str smem = tmkomut[2],tmkomut[3],0
    mem = Val (smem,Dec)
GOsub Terscevir    :Gun=SAYI

    str smem = tmkomut[4],tmkomut[5],0
    mem = Val (smem,Dec)
Gosub Terscevir    :Ay=SAYI

    str smem = tmkomut[6],tmkomut[7],0
    mem = Val (smem,Dec)
GOSUB Terscevir    :YIL=SAYI


'***********DS1302 ye saat yazılacak****************************
HSEROUT ["SAAT AYARLANDI",13,10]
high rtc_rst
output rtc_dta
shout rtc_dta, rtc_clk, 0,[$8E, 0]
low rtc_rst

    Delayus 50

High rtc_rst
output rtc_dta
shout rtc_dta, rtc_clk, 0, [$BE\8,saniye\8,dakika\8 ,saat\8 ,gun\8 ,ay\8 ,gunsirasi\8 ,yil\8 ,128\8]
low rtc_rst

    i = 0
    a = 0
    Komut[0]=0
    star = $a

goto kbekle                           
'*****************************************************************

ZaMaN_VeR:

    gosub zaman_oku
    hserout ["$",dec2 saat,":",dec2 dakika,":",dec2 saniye,"  ",dec2 gun,"/",dec2 ay,"/","20",dec2 yil,"@",13,10]
       i = 0
       a = 0
       Komut[0]=0
       star = $a

goto kbekle

AlArM_ayaR:
   
    'ASBBBssddGS  G=gün numarası (pazartesi=1) S alarm süresi  saniye olarak BBB kayıt belleği
   
    str smem = tmkomut[2],tmkomut[3],tmkomut[4],0
        bellek = Val (smem,Dec)
       
    HBusOut %10100000, (bellek * 8) , [tmkomut[5],tmkomut[6],tmkomut[7],tmkomut[8],tmkomut[9],tmkomut[10]]
   
        i = 0
        a = 0
        Komut[0]=0
        star = $a
goto kbekle 


AlArMVaRMi:
HSerIn 1,dng2,[StaR]
    if star = "?" then
        i = 0
        goto ayarbekle
    endif
   
Dng2:   
   
    if bellek = 254 then
'        i = 0
'        a = 0
'        Komut[0]=0
'        star = $a
        bellek = 0
        return
    endif
   
    HBusIn %10100001, (bellek * 8) , [oalarm[0],oalarm[1],oalarm[2],oalarm[3],oalarm[4],oalarm[5]]

    str smem = oalarm[0],oalarm[1],0
        asaat = Val (smem,Dec)
   
    str smem = oalarm[2],oalarm[3],0
        adakika = Val (smem,Dec)
   
    str smem = oalarm[4],0
        agunsirasi = Val (smem,Dec)
   
    str smem = oalarm[5],0
        sure = Val (smem,Dec)

    if asaat = saat and adakika = dakika and agunsirasi = gunsirasi then
            i = 0
            a = 0
            Komut[0]=0
            star = $a
            bellek = 0
            goto alarm_ok
    endif
bellek = bellek + 1
' goto alarmvarmi   bu döngü dönüşü seri portu dinlediği lable gittiği için iptal edip direk alarm taramaya yönlendirdim.
goto dng2  'Bu sadece alarmı tarayarak işi kısa sürde koysundiye yapıldı.

AlaRm_Ok:
high role
high alarmon
gosub zaman_oku
alarm_bas = saniye + sure

Dng3:
    gosub zaman_oku
    if saniye > alarm_bas then
        low role
        low alarmon
            Dng5:
            gosub zaman_oku
            if adakika = dakika then dng5
        return
    endif
goto dng3

AlArM_Ver:
bellek = 0
    DnG4:
        if bellek = 225 then
            i = 0
            a = 0
            Komut[0]=0
            star = $a
            bellek = 0
            goto kbekle
        endif
       
        HBusIn %10100001, (bellek * 8) , [oalarm[0],oalarm[1],oalarm[2],oalarm[3],oalarm[4],oalarm[5]]
        gosub gunne
        hserout ["$",dec3 bellek," ",oalarm[0],oalarm[1],":",oalarm[2],oalarm[3],":00 ",oalarm[4]," ",oalarm[5]," Sn @",13,10]
        STR GUNADI = 0,0
        bellek = bellek +1
    goto dng4   

END

GuNNe:
if oalarm[4] = "1" then strn gunadi = "PAZARTESI "
if oalarm[4] = "2" then strn gunadi = "SALI "
if oalarm[4] = "3" then strn gunadi = "CARSAMBA "
if oalarm[4] = "4" then strn gunadi = "PERSEMBE "
if oalarm[4] = "5" then strn gunadi = "CUMA "
if oalarm[4] = "6" then strn gunadi = "CUMARTESI "
if oalarm[4] = "7" then strn gunadi = "PAZAR "

return


AyArBeKLe:
hserout ["$ OK",13,10]
star =$a
goto kbekle

KBeKLe:
HSerIn 50,kbekle,[StaR]
high alarmon
high indiktor   

    if star = $a  then kbekle
    if star = "?" then ayarbekle 'bu satır pcdeki yazılım bağlantı yok derken cihaz bağlı kalırsa pc tekrar bağlanmasını sağlar                                             
    if star = "%" then
     
     Kb:
     Komut[i]= star
        Kb1:
            HSerIn 10,kb1,[StaR]
               
                If StaR = $d Then
                 strn tmkomut = str komut
'                 hserout["yaz ",str tmkomut,13,10]   
'                 hserout["0:",TMKOMUT[0]," 1:",TMKOMUT[1]," 2:",TMKOMUT[2],13,10]
                 if tmkomut[0] = "!"                      then CiK
                 if tmkomut[0] = "C" and tmkomut[1] = "S" then ZaMaN_AyArLa
                 if tmkomut[0] = "C" and tmkomut[1] = "W" then ZaMaN_VeR
                 if tmkomut[0] = "A" and tmkomut[1] = "S" then AlArM_ayaR
                 if tmkomut[0] = "A" and tmkomut[1] = "W" then AlArM_ver
                           i = 0
                           a = 0
                           Komut[0]=0
                           star = $a
                goto kbekle
                endif
         
          komut [i] = star
          i = i + 1
          GoTo kb1     
endif
goto kbekle 

CiK:
i = 0
star = $a
str tmkomut = 0
str komut = 0
low alarmon
low indiktor
goto basla

end   




     

MS_59

arkadaşlar foruma kod eklerken kod ekle (#) butonunu kullanıp ekleyelim
mehmet

kotan04


Powered by EzPortal