serin2 komutu icra edilirken diğer işlemlere nasıl geçilir ?

Başlatan sinasos, 09 Şubat 2018, 14:30:26

sinasos

Yok valla hocam yorgunluktan. Olması gerekeni yanlış izah etmişim. Tamamen benim hatam kusura bakmayın.

sinasos

Söylediğiniz şekilde V=5000 olarak değiştirdim ancak Vericiyi açınca led1 sürekli yanık kalıyor, kapatınca da led2 sürekli yanık kalıyor. Oysa ki vericiyi açınca led1 yanıp sönecek, kapatınca led2 yanıp sönecek. Bu arada V değişkeni word.

Tekrar teşekkür ederim yardımlarınız ve anlayışınız için.

ete

Şu programın tam halini bir görelim istersen böyle yarım yamalak olmuyor demekki.
IF ALICI=20 THEN GOSUB BAK diyorsun ama program BAK etiketine gidip geri dönüyor ve yeniden BAK etiketine gidiyor.
Bu yanlış. Birinci gidişte BAK sonunda RETURN görüp dönecek burada sorun yok ama ikinci gidişte Gosub ile gelmediği çin orada stack kararsızlığı yaşanacak.
Burayı düzeltmek gerek.
O nedenle programın bütününü görmek lazım.

Yada programı aşağıdaki şekilde değiştirip dene.
BAK:
    IF ALDIM=1 THEN
       LED1=1:ALDIM=0
       FOR V=0 TO 5000:NEXT
       LED1=0
    ELSE
        LED2=1
        FOR V=0 TO 5000:NEXT
        LED2=0
       
    ENDIF

goto bak



DISABLE
INT:
GIE=0
ALDIM=0
hserin 10,ATLA, [wait("ETE"),ALICI]
ALDIM=1
ATLA:
TEMP=RCREG
GIE=1
Resume
enable

Ete

sinasos

Tabiki hocam;


@ DEVICE pic16F628A 'işlemci 16F628 
@ DEVICE pic16F628A, WDT_on 'Watch Dog timer kapalı 
@ 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
include "modedefs.bas"
DEFINE OSC 4

'** BU ALAN SERİ İLETİŞİM PROTOKOLLERİ İÇERİR TÜM PİCLER İÇİN AYNIDIR **
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

OPTION_REG.7=1

CMCON=7
TRISA=%00000000
TRISB=%00000010
PORTA=0
PORTB=0

SYMBOL GIE  =INTCON.7 'genel interruptları açıyor
SYMBOL PEIE =INTCON.6 'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5 'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5 'USART Receive interrupt flag bit

SYMBOL LED1=PORTA.2     'LED1 ÇIKIŞI
symbol LED2=porta.3     'LED2 ÇIKIŞI
SYMBOL ROLE1=PORTB.6    '1.ROLE ÇIKIŞI
SYMBOL ROLE2=PORTB.5    '2.ROLE ÇIKIŞI
SYMBOL ROLE3=PORTB.4    '3.ROLE ÇIKIŞI
SYMBOL ROLE4=PORTB.3    '4.ROLE ÇIKIŞI
SYMBOL ROLE5=PORTA.1    '5.ROLE ÇIKIŞI
SYMBOL ROLE6=PORTA.0    '6.ROLE ÇIKIŞI
SYMBOL ROLE7=PORTB.0    '7.ROLE ÇIKIŞI
SYMBOL BZR  =PORTB.7    'BUZER ÇIKIŞI

TEMP    VAR BYTE
ALICI VAR BYTE 56
MESAJ VAR BYTE
Y   VAR WORD
x   var byte
V   VAR WORD
Q   VAR BIT
ALDIM VAR BIT
ALICI=1
y=0
x=0
Q=0
PAUSE 10
'*************   kesme oluşturma****************
INTCON=%11000000
ON INTERRUPT GOTO INT
RCIE=1
'***********************************************
BZR=1  :PAUSE 50:BZR=0
'***************** HANGI SİNYAL VAR AYRIMI *********************
BASLA:
        IF ALICI=10 OR ALICI=15 OR ALICI=20 OR ALICI=25 THEN Q=0:GOSUB BEEP2
        IF ALICI=30 THEN Q=1:GOSUB BEEP3   
        IF ALICI=40 THEN Y=0:GOSUB BEEP5   
IF ALICI=45 THEN Y=0:GOSUB BEEP6
    IF ALICI=50 THEN Y=0:GOSUB BEEP7   
IF ALICI=55 THEN Y=0:GOSUB BEEP8       
IF ALICI=35 THEN Y=0:GOSUB BEEP4
GOTO BASLA



'************************* yan proğramlar **********************************

BEEP:
BZR=1
PAUSE 20
BZR=0
pause 70
RETURN

BEEP2:
IF ALDIM=1 THEN
LED1=1:ALDIM=0:ROLE1=1:BZR=1:for v=0 to 150:BZR=0:next
FOR V=0 TO 3000:NEXT
LED1=0:ROLE1=0
ELSE
LED2=1:ROLE3=1
FOR V=0 TO 3000:NEXT
LED2=0:ROLE3=0
ENDIF
RETURN

BEEP3:
ROLE2=1:BZR=1
for v=0 to 10:BZR=0:next
for v=0 to 500:next
ALICI=1
RETURN

BEEP4:   'HOŞGELDİNİZ EKRANI ****** RESET *******
ROLE3=1:BZR=1
for v=0 to 10:BZR=0:next
for v=0 to 500:next
ALICI=1
RETURN

BEEP5:
ROLE4=1:BZR=1
for v=0 to 10:BZR=0:next
for v=0 to 500:next
ALICI=1
RETURN

BEEP6:
ROLE5=1:BZR=1
for v=0 to 10:BZR=0:next
for v=0 to 500:next
ALICI=1
RETURN

BEEP7:
ROLE6=1:BZR=1
for v=0 to 10:BZR=0:next
for v=0 to 500:next
ALICI=1
RETURN

BEEP8:
ROLE7=1:BZR=1
for v=0 to 10:BZR=0:next
for v=0 to 500:next
ALICI=1
RETURN

BEEP9:
BZR=1
for v=0 to 10:BZR=0:next
for v=0 to 500:next
ALICI=1
RETURN

'************************ KESME ***********************************
DISABLE
INT:
GIE=0
hserin 20,ATLA, [wait("ETE"),ALICI]
ALDIM=1 
ATLA:

if ALICI=<1 THEN role1=0:ROLE2=0:ROLE3=0:ROLE4=0:ROLE5=0:ROLE6=0:ROLE7=0
TEMP=RCREG
GIE=1
Resume
enable


END


ete

Yine farklı bir program verdin. Bu programda düşündüğün mantık zaten çalışamaz.
IF ALICI=10 OR ALICI=15 OR ALICI=20 OR ALICI=25 THEN Q=0:GOSUB BEEP2
bu komut satırına dikkat et. ALICI=10,15,20,25 olmadıktan sonra BEEP2 etiketine gidemezsin.
Yani aldın almadın varsayımı burada geçerli olmuyor maalesef.
Programın en başında aldın almadın tespiti herhangi bir if satırına bağlı olmaksızın değerlendirilmeli

BASLA:
      IF ALDIM=1 THEN
        LED1=1:ALDIM=0
        ROLE1=1:BZR=1
        FOR V=0 TO 3000
          IF V=300 THEN BZR=0
        NEXT
        LED1=0:ROLE1=0
        IF ALICI=30 THEN Q=1:GOSUB BEEP3   
        IF ALICI=40 THEN Y=0:GOSUB BEEP5   
        IF ALICI=45 THEN Y=0:GOSUB BEEP6
        IF ALICI=50 THEN Y=0:GOSUB BEEP7   
        IF ALICI=55 THEN Y=0:GOSUB BEEP8       
        IF ALICI=35 THEN Y=0:GOSUB BEEP4       
      ELSE
        LED2=1:ROLE3=1
        FOR V=0 TO 3000:NEXT
        LED2=0:ROLE3=0
      ENDIF       
     
      GOTO BASLA

Bu koddan sonra ALICI değerine bağlı olarak ne yapılacaksa yaparsın.
Ete

Powered by EzPortal