Whıle wend kullanımında zaman sorunun

Başlatan fzf, 23 Ekim 2016, 01:06:59

fzf

Slm arkadaşlar bir konuda yardımlarınızı bekliyorum
Pıc basıcte bir butona basınca bir motoru çalıştıran 5 dk sonra duran bir sistem kodu yazıyorum sistem çalışıyor fakat başka bir butonla bir valfi aktıf etmem gerekiyor basıc kodlarını yazdım çalışıyor
Tek sorunum motor çalışırken ve Zaman saymaya başlarken valfin butonuna basılı tutunca Zaman saymayı durduruyor motor çalışmaya sürekli devam edıyor tali ben butondan elimi çekinceye kadar çekince Zaman işlemeye devam edıyor Zaman dolunça motoru durduruyor butonlarda whıle wend komutunu kullandığım için bu sorunu yasıyorum bu komutun yerını alacak zamanı durdurmayacak bir komut varmı veya altenetifi olarak ne yapabilirim yardımcı olursanız sevınırım

ete

Buraya kod eklemediğin için nasıl zaman saydırdığını göremiyorum. Görebilsem ona göre çneride bulunurdum. Her neyse olayımgözümde canlandırmaya çalışıyorum ve iki alternatifli bir sistemle bu sorunun aşılabileceğini düşünüyorum hatta üç alternatif bile diyebiliriz.
Birincisi butona basınca program oraya bağlı kaldığı için programın diğer ucundaki zaman sayma bölümüne gidemiyor ve zamanı sayamıyor. O halde aynı aaman sayma kodunu da while wend arasına yerleştirmen bu sorunu çöze.
İkincisi while wend döngüsünü timer1 sayacı ike birlikte başlatırsın ve orada ne kadar kalacak ise o zamani diğer zamana eklersin. Bu alternatif pratik bir yol değil mevcut koda göre düzenlemek gerekir. While döngüsünden hangi durumlarda çıkıldığına bağlı olarak mantık da değişebilir.
Üçüncü alternatif ise bir RTC kullanarak zamanı ona saydırmak. Böylece zaman arka planda akar ve rtc onu sayar. Gerektiği zaman Aman okunarak ona göre iş yapılır.
Ete

Hattuşa

#2
yada buton içerisinde bir değişkeni aktif edersin. program içerisinde o değişken aktif ise saymaya başlar bittiğinde otomatik olarak değişken pasif olur ve programın asla donmaz pc ortamında bir örnek verecek olursak;


Basla:
if buton1 =0 then
sayac1 =1
motorac1 =1
endif

if buton2 =0 then
sayac2 =1
motorac2 =1
endif

if sayac1 =1  then
inc say1
        if say1 =100 then
       sayac1 =0
       say1 =0
       motorac1 =0
      endif
endif

if sayac2 =1  then
inc say2
        if say2 =100 then
       sayac2 =0
       say2 =0
       motorac2 =0
      endif
endif









fzf

cevaplarınız için çok tşkler buraya pıcbasıc kodlarını kırparak ekledim bu yol uzerınden  tek sayaç kullanarak yapılabilirmi bi incelerseniz sevinirim mesala kesme olayı denen komut olduğunu ögrendım bu komut kullanıp yapılabilirmi programın arka planında çalışıyor sanırım olma ihtimali varsa bilen arkdaslar nasıl aktıf edılecegını ilgili küçük bir kod yazabilirmisiniz
[code]'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 23.10.2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
ADCON1=%10001110
TRISA=%010001

TRISB=%00000000
TRISE=%100
TRISC=%00111111
TRISD=%00000000
PORTD=%00000000
PORTC=%00000000
PORTA=0
PORTB=0
PORTE=0
PORTD=0
DEFINE LCD_DREG PORTD   'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4   'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG PORTD   'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 3   'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_EREG PORTD       'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 2   'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS 4   'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 4   'LCD Kaç sıra yazabiliyor
ZAMANSAAT VAR WORD
ZAMANSAAT=0
ZAMANSAAT1 VAR WORD
ZAMANSAAT1=0
ZAMANSAY1 VAR WORD
ZAMANSAY1=0
ENTERSAY VAR BYTE
ENTERSAY=0
M1 VAR BYTE
M1=0
M2 VAR BYTE
M2=0
M3 VAR BYTE
M3=0
M4 VAR BYTE
M4=0
H VAR BYTE
H=0
MOF VAR BYTE
MOF=0
MON VAR BYTE
MON=0
MOF1 VAR BYTE
MOF1=0
ZAMAN2 VAR WORD
ZAMAN2=0
MON=50
MOF1=10

BASLA:
LCDOUT $FE,$94,"TIME.",#ZAMAN2,"."


'''''''''''''''''ISI VALFİNİ ACAR'''''''''''''''''''''''''''''''''''''''''
PORTC.6=1
IF PORTC.3=1 THEN 'ısı valfı acar
TOGGLE PORTB.0
WHILE PORTC.3=1
WEND
ENDIF
PORTC.6=0
''''''''''''''''' ZAMAN SAYMA BÖLÜMÜ'''''''''''''''''''''''''''''''''''''
IF ZAMANSAAT=1 THEN
ZAMANSAY1=ZAMANSAY1+1
ENDIF
IF ZAMANSAY1=255 THEN
ZAMANSAY1=0
ZAMAN2=ZAMAN2+1
ENDIF

'''''''''''''''MOTOR ÇALIŞMA BÖLÜMÜ'''''''''''''''''''''''''''''''''''''''
PAUSE 50
PORTC.7=1


IF PORTC.0=1 THEN
ZAMANSAAT=ZAMANSAAT+1
H=H+1
READ 13,ENTERSAY
READ 15,M1
READ 17,M3
WHILE PORTC.0=1
WEND
WRITE 20,PORTB.3:PAUSE 10
WRITE 18,H:PAUSE 10
ENDIF
IF H=>2 THEN
H=0
PORTB.3=0
PORTA.5=0
ZAMANSAAT=0
M1=0
WRITE 18,H:PAUSE 10
ENDIF








IF M1=1 AND H=1 THEN
WRITE 15,M1:PAUSE 10
PORTB.3=1
M4=0
MOF=0
M2=0
PAUSE 4
ENTERSAY=ENTERSAY+1
WRITE 13,ENTERSAY:PAUSE 10
ENDIF
IF ENTERSAY=MON THEN
PORTB.3=0
ENTERSAY=0
WRITE 13,ENTERSAY:PAUSE 10
M1=0
M2=1
ENDIF



IF M2=1 AND H=1 THEN
PORTB.3=0
PAUSE 4
MOF=MOF+1
ENDIF
IF MOF=MOF1 THEN
M2=0
m1=0
WRITE 15,M1:PAUSE 10
ENTERSAY=0
WRITE 13,ENTERSAY:PAUSE 10
M3=1
WRITE 17,M3:PAUSE 10
ENDIF



IF M3=1 AND H=1 THEN
M2=0
WRITE 17,M3:PAUSE 10
PORTA.5=1
MOF=0
M4=0
PAUSE 4
ENTERSAY=ENTERSAY+1
WRITE 13,ENTERSAY:PAUSE 10
ENDIF
IF ENTERSAY=MON THEN
ENTERSAY=0
PORTA.5=0
M3=0
M4=1

ENDIF

IF M4=1 AND H=1 THEN
M3=0
PAUSE 4
MOF=MOF+1

ENDIF
IF MOF=MOF1 THEN
ENTERSAY=0
WRITE 13,ENTERSAY:PAUSE 10
M4=0
M3=0
WRITE 17,M3:PAUSE 10
M1=1
WRITE 15,M1:PAUSE 10
ENDIF
GOTO BASLA
END
[/code]

ete

Sitede yayınlanmış Basic Dersleri mevcut. Ders-6 yı okumamı öneriyorum. Ayrıca ders notlarına ilaveler var orada da ilave-9 u incelemeni öneririm.
Her iki belgede de kesme konusu anlatılmıştır ve örnekler mevcuttur. Hatta işine yarayabilecek saat uygulamasıda olması gerek.
Ancak program yazma mantığın düzeltmeden ziyade yeniden yazmayı gerektirebilir.
Kesme konusunu inceledikten sonra hala sorunun varsa tekrar belirt daha derinlemesine inceleyelim konuyu. Açıklama verirken hangi butonun ne iş yaptığınıda belirt ki okuyan işi çözebilsin.
Ete

fzf

zaman ayarıp ilgilendigizin için tşk ederim sorunu
IF PORTC.3=1 THEN
ES=1
ENDIF
IF PORTC.3=0 AND ES=1 THEN
TOGGLE PORTB.0
ES=0
ENDIF
bu şekilde hallettım sizlere bir sorum daha olacak plc lerde hızlı sayıcı var pıc te buna denk bır komut varmı  acaba

ete

Hızlı sayıcıdan neyi kast ediyorsun pek anlamadım. Sen PLC lisanı ile ben pic lisanı ile konuşunca anlaşamıyoruz.
Pic komutlarla çalışır. Sayı=Sayı+1 dersen ve bu komutu sürekli işlenie hale gatirirsen çok hızlı sayar.
Ama picde timer0 sayacı geri planda çalışır ve direk kistalden puls alarak çok hızlı sayar ama onu durduramazsın sürekli sayar ve 8 bitlik sayactır. Ayrıca Timer1 sayacı varki 16 bitliktir istediğin zaman saydırı istediğinzaman durdurabilirsin.
Tam olarak ne istediğini bilmediğim için böyle genel bir açıklama verdim.
Ete

Powered by EzPortal