PIC BASIC yazılım yardım lütfen

Başlatan yerkirazi, 15 Ağustos 2014, 00:15:38

yerkirazi

Sayın arkadaşlar aşağıdaki yazılımı yazıp devremde denedim, gayet güzel çalışıyor gibiydi, bazen bir defa işlem yapıyor, bazen 2-3 defa işlem yapıp program donup kalıyor.

Fakat tus1 basılı olmadan devreyi çalıştırdığımda herşey yolunda giderken program bir süre sonra donuyor.
Hiç işlem yapmıyor.

Diğer taraftan tus1 basılı olarak çalıştırdığımda herşey yolunda güzel çalışıyor.
Aynı olay tus2 dede oluyor.
Yardımlarınız için şimdiden teşekkürler.

Saygılarımla.

PORTA=0:PORTB=0
TRISA=%00011111 'A portu çıkış olarak ayarlandı
TRISB=%10000000 'B.7 pini giriş diğerleri çıkış olarak ayarlandı.
'-----------------------------------------------------------------
@ DEVICE pic16F628A 'işlemci 16F628
@ DEVICE pic16F628A, WDT_OFF 'Watch
Dog
timer açık
@ DEVICE pic16F628A, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628A, PROTECT_ON 'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF 'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
CMCON=7 '16F628A de komparatör pinleri iptal hepsi giriş çıkış
'-----------------------------------------------------------------
SYMBOL TUS1=PORTA.1
SYMBOL TUS2=PORTA.2
SYMBOL ROLE=PORTB.0
SYMBOL ROLE1=PORTB.1
SYMBOL ROLE2=PORTB.2
'--------------------------GIRIS----------------------------------
PAUSE 2000
CLEAR

GIRIS:
'---------------------------TUS1----------------------------------
PAUSE 100
IF TUS1=1 THEN ' Anahtar kapalı ise
PAUSE 100
GOTO SMSDEPODOLU
ENDIF
'---------------------------TUS2----------------------------------
PAUSE 100
IF TUS2=0 THEN ' Anahtar kapalı ise
PAUSE 100
GOTO SMSDEPOBOS
ENDIF
GOTO GIRIS
'------------------------SMS DEPO DOLU----------------------------------
SMSDEPODOLU:
HIGH ROLE
PAUSE 600
LOW ROLE
PAUSE 800
HIGH ROLE
PAUSE 600
LOW ROLE
PAUSE 800
HIGH ROLE2
PAUSE 550
LOW ROLE2
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 65500
'PAUSE 65500
HIGH ROLE2
PAUSE 500
LOW ROLE2
PAUSE 65500
'------------------------NUMARA2---------------------------------
HIGH ROLE
PAUSE 600
LOW ROLE
PAUSE 800
HIGH ROLE
PAUSE 600
LOW ROLE
PAUSE 800
HIGH ROLE2
PAUSE 550
LOW ROLE2
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 65500
'PAUSE 65500
HIGH ROLE2
PAUSE 500
LOW ROLE2
GOTO EXIT

'------------------------SMS DEPO BOŞ----------------------------------
SMSDEPOBOS:
PAUSE 600
HIGH ROLE
PAUSE 600
LOW ROLE
PAUSE 800
HIGH ROLE
PAUSE 600
LOW ROLE
PAUSE 800
HIGH ROLE2
PAUSE 550
LOW ROLE2
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 65500
'PAUSE 65500
HIGH ROLE2
PAUSE 500
LOW ROLE2
PAUSE 65500
'------------------------NUMARA1----------------------------------
HIGH ROLE
PAUSE 600
LOW ROLE
PAUSE 800
HIGH ROLE
PAUSE 600
LOW ROLE
PAUSE 800
HIGH ROLE2
PAUSE 550
LOW ROLE2
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE1
PAUSE 800
LOW ROLE1
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 600
HIGH ROLE
PAUSE 800
LOW ROLE
PAUSE 65500
HIGH ROLE2
PAUSE 500
LOW ROLE2
GOTO EXIT
'------------------------son----------------------------------

EXIT:
IF TUS1=1 OR TUS2=0 THEN
PAUSE 200
GOTO EXIT
ENDIF

TUS1=0
TUS2=0
LOW ROLE
LOW ROLE1
LOW ROLE2
RETURN

END

ete

Asıl sorun EXIT alt programı sonunda yer alan RETURN komutu. Bir alt programdan RETURN ile çıkmak için oraya Gosub ile gidilmesi gerekir. Sen Goto ile gidip return ile dönmeye çelışıyorsun. Her return komutu stack dan dönüş adresi alınarak geri dönüş yapılması gereken bir komuttur. Sen gosub ile gidersen ayrılma adresi dönüş adresi olarak stack e yazılır. Goto ile gidersen stack de bir adrex yer almaz ve program rastgele bir adrese gitmeye çalışırki buda onun bir müddet sonra donmasına sebep olur.

Çözüm için ya EXIT isimli alt programa Gosub ile git ki buda başka sorunlar doğurabilir, yada en iyisi Return yerine Goto Basla yaz olsun bitsin.

Bu kadar oause neden gerekli amlamadım ama o kısıma bir kere girildimi dakikalarca program orada kalmaktadır. Amacın ne olduğu bilinmediği için öneride bulunamıyorum.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com