Ynt: PicBasic'de yazılmış bir program ve devresinin modifiyesi

Başlatan KralMurat, 05 Nisan 2013, 13:43:37

KralMurat

Merhabalar,

Pic programlama konusunda biraz yeniyim, belki basit bir soru olacak ama fikrinizi almak istedim.

Şimdi elimde bir devre var, Pic16f628 ile yapılmış bir devre. Devrede 1 adet röle var, fakat ben devreyi ve kaynak kodunu biraz modifiye ederek 2 röleyi kontrol edecek şekilde düzenlemek istiyorum. Fakat 2. röle için hiçbir I/O portu kalmıyor maalesef. PORTA'nın tüm pinleri sensörler ve birkaç buton için kullanımda. PORTB ise Ortak katotlu bir DIGIT (8 şeklindeki display) sürmek için kullanılmakta. PORTB'nin 8 pini, digit'in ABCDEFG ve (dot) olmak üzere 8 pinini sürüyor. Burda (dot) sürmek gereksiz, yani PORTB.7'inci bitini 2. röle için kullanabilirim, pic'den veri almaya gerek yok digit'in nokta led'ini yakmak için, bunu iptal edebiliriz.

Fakat söyle bir sorunla karşılaşabileceğimi düşünüyorum, eğer PORTB.7'ye röle bağlarsam, digit'e veri sürüldüğü zaman (örneğğin digit'te 3 yazmasını istediğim zaman) gönderdiğim veri röleyi etkileyecektir, çünkü digit'e veriyi direk PORTB'ye aktararak sürüyorum. Buda 8. pin'e bağlı 2. röleyi etkileyecektir değil mi? Birinci sorum bu.

Bunu engellemek için söyle birşey geldi aklıma, PORTA'ya bağlı butonlardan birini PORTB.7'ye bağlasam, yani TRISB'ye '10000000' atsam ve PORTB.7'yi input yapsam, ve geri kalan 7 bite de digit'i aynı şekilde bağlasam, digit'e veri gönderdiğim zaman (yani örneğin 3 bilgisini direk PORTB'ye aktardığım zaman) program hata verir mi? İkinci sorumda bu. Eğer hata vermezse, butonlardan birini PORTB'deki (dot)'tan arttırdığımız pine taşırım, PORTA'daki aktarılan butonun yerine de kontrol etmek istediğim 2. rölemi bağlamış olurum.

Olabildiğince basit anlatmaya çalıştım umarım karışmamıştır. Bu konudaki yardımlarınızı bekliyorum (aslında multiplexer kullanarak 8 bir yerine 3-4 bitle digit sürüp fazladan 4-5 bit arttırılabilir, veya PORTA'daki 4 buton pic'de 2 portla kontrol edilebilir belki ama bunları teorik olarak biliyorum, devreye uyarlayacak kadar bilgi sahibi değilim, o yüzden en basit şekilde 1 pin arttırıp digit'e sayı bilgisi göndermemi etkilemeyecek şekilde 1 röle daha bağlayabilmem gerekiyor  PORA'da arttırılacah hiç pin yok, o yüzden mecburen digit'in bağlı olduğu PORTB2den arttırmam gerekiyor) Zaman ayırdığını için teşekkürler  cevaplarınızı bekliyorum

mesaj birleştirme:: 05 Nisan 2013, 13:44:05

Aslında ben tam olarak ne yapmak istediğimi anlatayım, 2. röle olayını çözdükten sonra kodlama kısmında da yardıma ihtiyacım olabilir çünkü  hem devreyi gördüğünüzde 2. röle için anlattıklarımı da daha iyi görebilir ve yardımda bulunabilirsiniz diye düşündüm.

Modifiye etmek istediğim devre şu :

https://320volt.com/ayarlanabilir-termometre-devresi-16f628-ds18b20-picbasic-pro/

Bu devre sadece ısıtıcı bağlanarak ortam ısısını belirli bir seviyede tutmayı sağlayan bir termostat. Ben bunu peltier kullanarak hem ısıtıcı hemde soğutucu elemanı kontrol eden bir devreye dönüştürmek istiyorum. Bu yüzden 2 röleye ihtiyacım var. Tek röleylede peltieri kontrol edebilirim aslında ama peltier'in sürekli çalışması gerekiyor ozamanda. Rölenin 2 konumu olduğu için birisinde ısıtıcı birisinde soğutucu olarak çalışması gerekecek, buda çok verimsiz olacak, belli bir ısı aralığında peltier'in çalışmadan durması gerekiyor.

Mevcut devrenin çalışması şu şekilde, bir sıcaklık değeri set ediyoruz, birde tolerans değeri veriyoruz. ortam sıcaklığı Set edilen değere (örneğin 27 dereceye) gelene kadar röleyi sürüyor (ısıtıcıyı çalıştırıyor). 27 dereceye gelince röleyi kesiyor. ve tolerans değerinin altına düşene kadar (örneğin tolerans değeri 0.5 derece ise 26.5'e gelene kadar) ısıtıcıyı çalıştırmıyor, 26.5'in altına düştüğü anda tekrar 27 olana kadar röleyi sürüyor.

Benim modifiye etmek istediğim devrenin ise çalışma prensibi şu şekilde olmalı, yine sıcaklığı 27 dereceye set ettiğimizi ve toleransın 0.5 derece olduğunu varsayarsak, eğer sıcaklık 26.5'in altında ise 1. röleyi sürerek ısıtıcıyı çalıştıracak, 27 dereceye gelince 1. röleyi (ısıtıcıyı) kesecek. Eğer sıcaklık 27.5'in üzerine çıkarsa da soğutucuyu çalıştıracak, 27 dereceye kadar soğutunca da 2. röleyi (soğutucuyu) kesecek. Yani sıcaklık 26.5-27.5 arasında tutulmuş olacak. ve peltier devamlı çalışmak zorunda kalmayacak. Sıcaklığı 27 dereceye getirince peltier çalışmayı bırakacak, 26.5'un altına düşünceye kadar veya 27.5'un üzerine çıkıncaya kadar çalışmayacak.

Eğer bu mevcut devreyi dediğim şekilde modifiye etmeyi başarabilirsek harika bir termostat devresi ortaya çıkarmış oluruz, devreyi tasarlayan arkadaşa fikir önerisinde bulunduk bir arkadaşımla birlikte ama tasarlayan arkadaş pek oralı olmadı  buna ayıracak zamanı olmadığını söyleyince bizde şansımızı forumlarda deneyelim dedik

İnternette de buna benzer bir proje (hem ısıtıcıyı hem soğutucuyu kontrol eden) bulamadım, var ama şöyle var, ısı 27 dereceye set edilmişse tolerans değeri kadar aşağı inince ısıtıcıyı çalıştırıyor, set edilen değerin üzerine çıkar çıkmaz soğutucuyu çalıştırıyor, yani tolerans değeri kadar üstüne çıkmasını beklemiyor. O yüzden bu önerdiğim devreyi yapabilirsek çok daha kullanışlı ve internette olmayan (veya bulamadığım) bir devre tasarlamış olacağız. Durum genel olarak bu

Maxim

hazır termostat alsanıza iş görmüyormu ?
ısıtma-soğutma yapanları var
hemde ucuz
örnek: enda EDT2423

mehmet

MAX7219 ile displayları sürseniz pinlerden tasarruf
yaparsınız...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

muhittin_kaplan

#3
eğer 7 segment display i doğrydan portb ile sürüyorsa bir pin boş dur.(yada noktadadır) siz burada
3 yazması için a,b,c,d,g nin ışık vermesini sağlaması gerekir.(buda $X1001111)
yani anlayacağın portb nin 7. biti noktadan alıp kullanabilirsiniz.

mesaj birleştirme:: 05 Nisan 2013, 16:13:58

internette histerisis termostat diye aratırsanız muhtemeldir ki bulursunuz.

örnek
(http://urun.gittigidiyor.com/bilgisayar/at89c51-ile-menulu-histerisiz-ayarli-termostat-29138222)

KralMurat

Maxim hocam, hazır termostatların birkaçtanesini inceledim, EMKO'nunkini incelemiştim örneğin, 2. mesajımın sonunda yazdığım sıkıntı ortaya çıkıyor, yani soğutucuyu çalıştıran röle set edilen değeri 0.1 derece geçer geçmez devreye giriyor. Set edilen değerin tolerans değeri kadar üzerine çıkınca soğutucuyu çalıştırmasını istiyorum ben, fakat hazır termostatlar böyle çalışmıyor, yada benim incelediklerim böyle çalışmıyordu, ayrıca eğer yapabilirsem bundan çok sayıda kullanmam gerekecek, eğer bu devreyi istediğim gibi modifiye edebilirsem maliyeti 10 lirayı geçmiyor, hazır termostatlar 40-50 liradan aşağı değil, hemde asıl önemlisi istediğim bu artı tolerans özelliği yok.

Mehmet hocam dediğim gibi bunlar birer alternatif ;) fakat birincisi baskıdevre çizimi falan herşey hazır, o yüzden üzerinde çook fazla oynamadan sadece 1 pin arttırmak yeterli oluyor benim için, ikinciside multiplexer kullanmayı doğruluk tablolarını falan teoride biliyorumda uygulamada bilmiyorum, o yüzden çok girmek istemiyorum ona, zaten 1 pin arttırmam yeterli. Onuda noktayı arttırırsak yetiyor, benim asıl sorum PORTB'nin 1 pinini buton yaptığım zaman ve PORTB'ye sayı yazdırmak için veri gönderdiğim zaman sorun olurmu? Çünkü gönderdiğim veri 8 bit olacak, fakat PORTB'nin 7 biti output 1 biti input olacağı için output olarak atanmış bir bite veri göndermiş oluyoruz, burda programsal olarak bir sıkıntı olurmu asıl sormak istediğim oydu.

Muhittin hocam sayıların yanması için tüm değerler hesaplanmış look-up tablosuna yazılmış, yani 3 yazdırmak istediğim zaman direk look-up tablosundan 01001111 değerini alıp 3 yazıyor onda sorun yok ;) benim sormak istediğim X yazmışsınız ya yani ilk değer için, look-up tablosundan 01001111 değerini alıp PORTB'ye atmaya çalıştığı zaman ilk bite değer atamicak çünkü o bit input olarak ayarlanmış olacak, diğer 7 bit ok output ama 1 bit input olduğu için ve o X diye belirttiğiniz değeri atamadığı için acaba hata verir mi? Asıl düşündüğüm nokta oydu benim :) Hata vermez mi diyorsunuz?

muhittin_kaplan

şunu denemeniz gerekir

input portb.7
portb=%01111111  burası 8 yazması içindir.

ben bir problem olmayacağı kanısındayım.

KralMurat

Muhittin hocam selamlar, çok teşekkür ederim cevabınız için, tamamdır ozaman 2. röle için pin'i bulduk :) ben biraz kodları inceleyeyim istediğim modifikasyonu ana programa yerleştirmeyte çalışayım, takıldığım yerleri yine burdan sizlere sorayım. Şimdilik teşekkürler ;)

z

Alıntı yapılan: KralMurat - 05 Nisan 2013, 13:43:37
....PORTB'nin 8 pini, digit'in ABCDEFG ve (dot) olmak üzere 8 pinini sürüyor. Burda (dot) sürmek gereksiz, yani PORTB.7'inci bitini 2. röle için kullanabilirim, pic'den veri almaya gerek yok digit'in nokta led'ini yakmak için, bunu iptal edebiliriz.

Fakat söyle bir sorunla karşılaşabileceğimi düşünüyorum, eğer PORTB.7'ye röle bağlarsam, digit'e veri sürüldüğü zaman (örneğğin digit'te 3 yazmasını istediğim zaman) gönderdiğim veri röleyi etkileyecektir, çünkü digit'e veriyi direk PORTB'ye aktararak sürüyorum. Buda 8. pin'e bağlı 2. röleyi etkileyecektir değil mi? Birinci sorum bu.

Segmentleri yakacak bilgiyi okudun. Nokta yerine role çalıştıracaksın.

Veriyi 7F ile and yaparak dot bilgisini sıfırıla.  Bu veriyi 0 yada 80H olan role bilgisi ile or yap. Ardından PORTB ye yaz.

Bu durumda Role değişkenine, roleyi çalıştırmak istiyorsan 80H, durdurmak istiyorsan 00H yazman yeterli olur.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

aynen,
Dim Sayi as byte--gibi bir değişken olsun.
PortB=$80 | Sayi dediğimizde röle çeker ve sayımız ekranda görünür
PortB=$00 | Sayi dediğimizde röle açılır (enerjiyi keser)  sayımız yine ekranda görünür.

( | oparetörü bit işlem, mantıksal OR olarak yazdım  )

KralMurat

Hımm anladım, Evet mantıklı bu aklıma gelmemişti, ama burda sürekli olarak röle'nin açıkmı kapalı mı olduğunu kontrol etmek zorunda kalırız, çünkü anlık olarak sürekli sıcaklığı kontrol ediyor ve ekrana yazdırıyoruz, her ekrana yazdırma işleminde de gidip rölenin o anki durumunu kontrol edip ona göre yazdırmamız gerekir, biraz daha programı kasar gibi geldi bana, Eğer ki PORTB'nin son bitine buton bağladığımızda ve veriyi direk PORTB'ye attığımızda sorun çıkmıyorsa, bu çözüm daha iyi olur gibi geliyor. Ne dersiniz?

muhittin_kaplan

Yok neden problem olsun. Her Ekranı Tazelediğinde RÖle Çekiliyse Çekili Kalır Değilse Açık.


sadogan

Alıntı yapılan: muhittin_kaplan - 06 Nisan 2013, 13:40:47
aynen,
Dim Sayi as byte--gibi bir değişken olsun.
PortB=$80 | Sayi dediğimizde röle çeker ve sayımız ekranda görünür
PortB=$00 | Sayi dediğimizde röle açılır (enerjiyi keser)  sayımız yine ekranda görünür.

( | oparetörü bit işlem, mantıksal OR olarak yazdım  )
PortB=$00 | Sayi dediğimizde röle açılır (enerjiyi keser)  sayımız yine ekranda görünür. | Sayi dediğimizde röle açılır (enerjiyi keser)  sayımız yine ekranda görünür.
Hocam orlamada 0 etkisiz eleman deyilmidir
PortB &=$7F Sayi dediğimizde röle açılır (enerjiyi keser)  sayımız yine ekranda görünür.
0x7F ile AND lemek gerekir.

KralMurat

Fakat her ekranı tazelediğimizde yeniden değeri PORTB'ye atmamız lazım, o yüzden PortB=$80 | Sayi şeklinde mi atacağız yoksa PortB=$00 | Sayi şeklindemi atacağız bunu sürekli kontrol etmemiz gerekir, onu demek istemiştim, O yüzden POTRA'daki bir butonu (aşağıdaki resimde görülen SET butonunu örneğin) PORTB'nin son bitine (noktanın yerine) bağlayıp, röleyi PORTA'ya bağlamak biraz daha kolay gibi geldi bana.

Muhittin hocam programın kaynak kodunu yazsam, acaba 2. mesajımda bahsettiğim yapmak istediğim değişikliği nasıl yapabileceğime bir göz atabilirmisiniz acaba? Sıfırdan program yazılmicak sadece olan programın üzerine ekleme yapılacak (set edilen değerin tolerans değeri kadar üzerine çıkıldığı zaman 2. röleyi çekecek, set edilen değere geldiğinde de röleyi bırakacak) program şu anki haliyle set edilen değerin tolreans değeri kadar altına inince 1. röleyi çekiyor, set edilen değere gelince de bırakıyor, bizim bunu set edilen değerin tolerans değeri kadar üzerine çıkınca da 2. röleyi çekecek şekilde modifiye etmemiz gerekiyor, kaç gündür kodu anlamaya çalışıyorum ama picbasic'de baya yetersizim, hex kodunu asm'ye çevirip düzenlemeye çalıştım (asm'yi biraz daha iyi biliyorum) bu seferde tüm değişkenler vs saçma sapan isimlerle çevriliyor, ve anlaşılması imkansız oluyor hex to asm programlarıyla çevirince. Muhittin hocam siz veya biraz vakit ayırabilecek herhangi bir arkadaş koda bir göz atıp eğer müsaitseniz dediğim değişikliği kodlayıp bana atabilirseniz çok sevinirim.

Devre şeması :


Kod:

'****************************************************************
'*  Name    : TERMOMETRE.BAS                                    *
'*  Author  : [FERHAT YOL]                                      *
'*  Notice  : DS18B20'li oda termometresi]                      *
'*          :                                                   *
'*  Date    : 12.02.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   : Isı sensörü olarak DS18B20 kullanılacaktır. Sensör*
'*          : kablosu 15 metreden fazla olaması halinde DS18B20 *
'*          : Data bacağına bağlı olan 4.7K direnci 2.2K direnç *
'*          : ile değiştirilmesi gerekmektedir.                 *
'****************************************************************
DEFINE OSC 4

@ DEVICE pic16F628                      'işlemci 16F628                               
@ DEVICE pic16F628, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak

TRISA=%10111000
TRISB=%00000000
PORTA=0:PORTB=0

CMCON=7  'Comparatör pinleri iptal hepsi giriş çıkış
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
'presc:000=1/2, 001=1/4, 010=1/8, 011=1/16, 100=1/32, 101=1/64, 110=1/128,111=1/256   
OPTION_REG=%00000011  'Pull up dirençleri İPTAL- Bölme oranı 1/16
INTCON=%10100000  'Kesmeler aktif ve TMR0 (bit5) kesmesi aktif
TMR0=99

'---------------------------PIN TANIMLAMALARI-----------------------------------
SYMBOL SET=PORTA.5
SYMBOL YUKARI=PORTA.4
SYMBOL ASAGI=PORTA.3
SYMBOL DIG0=PORTA.0
SYMBOL DIG1=PORTA.1
SYMBOL DIG2=PORTA.2
'-------------------------------------------------------------------------------
ROLE  VAR PORTA.6
'-----------------------------DEĞİŞKENLER---------------------------------------

SAYAC  VAR  BYTE
SIRA   VAR  BYTE
SAYI   VAR  BYTE
TERM   VAR  WORD
ISIS   VAR  WORD
ONDA   VAR  BYTE
AKTAR1 VAR  BYTE
AKTAR2 VAR  BYTE
AKTAR3 VAR  BYTE
SYC    VAR  BYTE
SNS    VAR  BYTE
SNY    VAR  BYTE
ISIH   VAR  BYTE
ISIL   VAR  BYTE
TUS    VAR  BIT
DP     VAR  BIT
W      VAR  BIT
U      VAR  BIT
Z      VAR  BYTE
X      VAR  BYTE
I      VAR  WORD
'---------------------------------ISI TANIMLAMALARI-----------------------------
    Busy        VAR BIT         ' Busy Status-Bit
    HAM         VAR   WORD
    ISI         VAR WORD        ' Sensör HAM okuma değeri
    Float       VAR WORD        ' Holds remainder for + temp C display       
    ISARET_BITI VAR HAM.11'Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
    EKSI_ISI    CON 1           ' Negatif_Cold = 1
    SERECE      CON 223         ' ° işareti
    ISARET      VAR BYTE       
    Comm_Pin    VAR   PORTA.7
'--------------------------------------------------------------

BASLANGIC:DP=0'--------------------BAŞLANGIC------------------------------------   
gosub EKRAN3
gosub SENSORYAZ
GOSUB SENSOROKU
read $0,ISIL
READ $1,ISIH
READ $2,SNS
IF ISIL>99 THEN ISIL=0
IF ISIH>9 THEN ISIH=0
IF SNS>50 THEN SNS=0
TERM=(ISIL*10)+ISIH
ISIS=TERM-SNS
GOSUB DELAY1
DP=1:W=1:SYC=0

BASLA:'----------------------------ANA DONGÜ------------------------------------
GOSUB EKRAN
GOSUB SENSOROKU
GOSUB KONTROL

IF TUS=1 THEN GOTO AYAR
GOTO BASLA

'--------------------------------ALT PROGRAMLAR---------------------------------

SENSOROKU:
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
SENSORYAZ: 'okumaya hazırlan..         
OWOUT   Comm_Pin, 1, [$CC,$4E, $FF, $FF, $7F]
OWOUT   Comm_Pin, 1, [$CC,$48]         
OWOUT   Comm_Pin, 1, [$CC,$B8]         
OWOUT   Comm_Pin, 1, [$CC,$BE]         
return

   
Hesapla:  ' Ham değerden Santigrat derece hesabı
    ISARET  = "+"
    IF ISARET_BITI = EKSI_ISI THEN
       ISARET   = "-" 
       ham=~ham+2
    endif
    float = (HAM*10)/16 
    RETURN 
END
     
RETURN

KONTROL: ' Role kontrol..
IF ISIS=>FLOAT THEN
  SYC=SYC+1
   IF SYC=>3 THEN
   SYC=3:HIGH ROLE
   ENDIF
endIF
IF FLOAT=>TERM THEN
  SYC=0:LOW ROLE
ENDIF
RETURN   

DELAY: 'gecıkme 1
  FOR I=0 TO 150:NEXT
RETURN
DELAY1:'gecıkme 2
  FOR I=0 TO 12000:NEXT
RETURN
DELAY2:'gecıkme 3
  FOR I=0 TO 125:NEXT
RETURN

EKRAN:'Sıcaklık gösteriliyor.
Z=FLOAT DIG 0:GOSUB AL:AKTAR1=SAYI         
Z=FLOAT DIG 1:GOSUB AL:AKTAR2=SAYI
Z=FLOAT DIG 2:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN1: 'SET yazısı
Z=14:GOSUB AL:AKTAR1=SAYI
Z=13:GOSUB AL:AKTAR2=SAYI
Z=5:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN2:'Set değeri gösteriliyor
Z=TERM DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
Z=TERM DIG 1:GOSUB AL:AKTAR2=SAYI
Z=TERM DIG 2:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN3:
AKTAR1=64
AKTAR2=64
AKTAR3=64
RETURN
EKRAN4:'Hassasiyet ekranı
Z=SNS DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
Z=SNS DIG 1:GOSUB AL:AKTAR2=SAYI
aktar3=0
RETURN

AL: LOOKUP Z,[63,6,91,79,102,109,125,7,127,111,99,57,64,121,120],SAYI :RETURN'Karekter al

KAYDET: 'Değerler eproom'a kaydediliyor..
WHILE TUS=1:WEND
ISIL=TERM/10
ISIH=TERM//10
WRITE $0,ISIL:PAUSEUS 2
WRITE $1,ISIH:PAUSEUS 2
WRITE $2,SNS:PAUSEUS 2
GOTO BASLANGIC

AYAR: 'Menuye gırıs
WHILE TUS=1:WEND
DP=0
GOSUB EKRAN1
GOSUB DELAY1
READ $0,ISIL
READ $1,ISIH
TERM=(ISIL*10)+ISIH
DP=1:syc=0:SNY=0:W=0

MENU:
IF YUKARI=0 THEN
W=1:U=0:sny=0
TERM=TERM+1
WHILE YUKARI=0
   SYC=SYC+1:GOSUB DELAY
     IF SYC>40 THEN
       SYC=50:TERM=TERM+1:GOSUB DELAY
     ENDIF
   GOSUB EKRAN2
   IF TERM>990 THEN TERM=0
WEND
SYC=0:IF TERM>999 THEN TERM=990
ELSE
W=0
ENDIF

IF ASAGI=0 THEN
W=1:U=0:sny=0 
TERM=TERM-1
WHILE ASAGI=0
   SYC=SYC+1:GOSUB DELAY
     IF SYC>40 THEN
       SYC=50:TERM=TERM-1:GOSUB DELAY
     ENDIF
   GOSUB EKRAN2
   IF TERM>999 THEN TERM=990
WEND
SYC=0:IF TERM>999 THEN TERM=990
ELSE
W=0
ENDIF

IF TUS=1 THEN
GOTO SENSIVITY
ENDIF
GOSUB EKRAN2
GOTO MENU

SENSIVITY: '| menusu giriş..
WHILE TUS=1:WEND
read $2,sns
IF SNS>50 THEN SNS=0
DP=1:SNY=0
SENS:
GOSUB EKRAN4
IF YUKARI=0 THEN
W=1:SNY=0:U=0 
SNS=SNS+1
WHILE YUKARI=0
   SYC=SYC+1:GOSUB DELAY
     IF SYC>40 THEN
       SYC=40:SNS=SNS+1:GOSUB DELAY2
     ENDIF
   GOSUB EKRAN4
   IF SNS=>50 THEN SNS=50
WEND
SYC=0:IF SNS=>50 THEN SNS=50
ELSE
W=0
ENDIF           

IF ASAGI=0 THEN
W=1:U=0:sny=0
SNS=SNS-1
WHILE ASAGI=0
   SYC=SYC+1:GOSUB DELAY
     IF SYC>40 THEN
       SYC=40:SNS=SNS-1:GOSUB DELAY2
     ENDIF
   GOSUB EKRAN4
   IF SNS>50 THEN SNS=0
WEND
SYC=0:IF SNS>50 THEN SNS=0
ELSE
W=0
ENDIF

IF TUS=1 THEN
GOTO KAYDET
ENDIF
GOTO SENS

Disable               
KESME:  'kesme alt programı
  IF SET=0 THEN
  TUS=1
  ELSE
  TUS=0
  ENDIF
 
IF W=0 THEN
  SNY=SNY+1
  IF SNY=>120 THEN
    U=1
    ELSE
    U=0
  ENDIF
ENDIF
IF SNY=>240 THEN SNY=0

   SAYAC=SAYAC+1            
      If SAYAC>2 then SAYAC=0   

    If SAYAC=0 then
     DIG2=0
     PORTB=AKTAR1
     DIG0=1 
      PAUSEUS 2      
     Endif

     If SAYAC=1 then      
     DIG0=0
     PORTB=AKTAR2
     PORTB.7=DP
     DIG1=1
     PAUSEUS 2
     Endif
    
     If SAYAC=2 then      
     DIG1=0
     PORTB=AKTAR3
     DIG2=1
     PAUSEUS 2
     Endif   
         
      TMR0=160
    INTCON.2=0
             
    Resume      
   Enable   
  end           

z

Role diye bir değişkenin olacak. Sen role çeksin istiyorsan bu değişkene 80H yazacaksın. Çekmesin diyorsan 00H yazacaksın.
Ekran tarama rutinin, display segment bilgilerinin oluştururken role değişkenine de bakarak verilen mantık işlmeleri çerçevesinde dot pininden çıkacak bilgiyi oluşturacak.

Hepsi bu. Ekran ne tararsa tarasın senin role bilgin her defasında porttan çıkacak.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Hocam tamirattan pek Hoşlanmam. Önce Yazılanla ne yapılmak istendiğini Anlamam Gerek,
Verilen Öneriler Doğrultusunda yaparsanız daha iyi olur kanısındayım.