Belirli bir süreyi bekletmek.

Başlatan kaganayanoglu, 14 Haziran 2016, 14:37:23

kaganayanoglu

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  :                                     *
'*  Notice  : Copyright (c) 2015                                *
'*          : All Rights Reserved                               *
'*  Date    : 5.3.2014                                          *
'*  Version : 1.02                                               *
'*  Notes   : 14.06.2016                                                  *
'*          : BOOM                                                  *
'******************************************************************************* 

;----[16F88 Hardware Configuration]---------------------------------------------

;----[16F88 Hardware Configuration]---------------------------------------------
#CONFIG
cfg1 = _INTRC_IO              ; INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin
cfg1&= _WDT_OFF               ; WDT disabled
cfg1&= _PWRTE_OFF             ; PWRT disabled
cfg1&= _MCLR_OFF              ; RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD
cfg1&= _BODEN_OFF              ; BOR enabled
cfg1&= _LVP_OFF               ; RB3 is digital I/O, HV on MCLR must be used for programming
cfg1&= _CPD_OFF               ; Code protection off
cfg1&= _WRT_PROTECT_OFF       ; Write protection off
cfg1&= _DEBUG_OFF             ; In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins
cfg1&= _CCP1_RB0              ; CCP1 function on RB0
cfg1&= _CP_ALL                ; 0000h to 0FFFh code-protected (all protected)
  __CONFIG _CONFIG1, cfg1

cfg2 = _FCMEN_OFF             ; Fail-Safe Clock Monitor disabled
cfg2&= _IESO_OFF              ; Internal External Switchover mode disabled
  __CONFIG _CONFIG2, cfg2

#ENDCONFIG

DEFINE OSC 4 
DEFINE ADC_BITS 10      ' ADCIN resolution  (Bits)   
DEFINE ADC_CLOCK 3      ' ADC clock source  (Fosc/8)   
DEFINE ADC_SAMPLEUS 20  ' ADC sampling time (uSec)

ANSEL  = %00000011  ' AN0,AN1 ANALOG, DİĞERLERİ DİJİTAL,  
'ANSEL = 0
ADCON1 = %10000000  ' 1024 (10 BİT) hesaplanacak, (VREF+ vref+) (VREF-AVSS)
'ADCON0 = %11101101  ' internal A/D module RC oscillator,  11000000
OSCCON = %01101110  ' İNTERNAL OSİLATÖRÜ 4mhz' E AYARLA
CMCON  = 7           'komparatör pinleri iptal hepsi giriş çıkış   
TRISA  = %00000001   ' RA0 GİRİŞ, DİĞERLERİ ÇIKIŞ   
TRISB  = %00011110   ' B1,B2,B3,B4 GİRİŞ
PORTA  = 0           ' PORTA SIFIRA ÇEK    
PORTB  = 0           ' PORTB SIFIRA ÇEK                                               

'---------------------------PİN AYARLARI----------------------------------------   
LED   VAR PORTA.2
GAS   VAR PORTA.3   
SHOCK VAR PORTA.4
AYAR  VAR PORTA.0
LDR   VAR PORTA.1 
PAUSE 10

SAYAC  VAR word
SANIYE VAR WORD

Pause 100 ' 100 ms AÇILIŞ GECİKMESİ
HIGH LED 
PAUSE 300
LOW LED
pause 300 
HIGH LED 
PAUSE 300
LOW LED
pause 300 
HIGH LED 
PAUSE 300
LOW LED
pause 300


BASLA:
BASLA:
SAYAC=SAYAC+1
IF SAYAC=61 THEN     'sayac 61 olmuş ise 1 saniye süre geçti o halde
SAYAC=0              'sayaç sıfırlanıyor
SANIYE=SANIYE+1      'saniye değeri bir artırılıyor
IF SANIYE=60 THEN    'saniye 60 olmuş ise 1 dakika süre geçti o halde
SANIYE=0             ' saniye sıfırlanıyor
GOSUB ATESLE         ' ateşle alt menüsüne git
ENDIF
HIGH LED             ' ledi yak
PAUSE 2000           '2000 ms bekle
ENDIF
GOTO BASLA           'başla etiketine dön

ATESLE:
HIGH LED 
PAUSE 200
LOW LED
PAUSE 200
HIGH LED 
PAUSE 200
LOW LED
PAUSE 200

HIGH GAS
PAUSE 1000
LOW GAS
PAUSE 10

HIGH SHOCK
PAUSE 200
LOW SHOCK
PAUSE 10
return                
     


Bu basit kodda süreyi saydıramıyorum. Doğrudan
HIGH LED
PAUSE 2000
satırına geçiyor ve led yanık kalıyor.

Nerede hata var acaba?    :-\

ferit06

#1
Derleyicin nedir? Bu kodu derliyor mu?

İlk yazdığımda 1 Adet ENDIF eksiti  o arada düzeltilmiş. Şimdi ise  iki adet BASLA Etiketi var.

Programında mantık hatası var....
BASLA:
SAYAC=SAYAC+1
If SAYAC=61 Then     'sayac 61 olmuş ise 1 saniye süre geçti o halde
                      ' Senin işlemcim 4 MHz ile çalışıyor yani 1 uS ne bir işlem yapıyor
                      'döngünün 1 salise olduğuna nasıl karar verdin?
    SAYAC=0              'sayaç sıfırlanıyor

    SANIYE=SANIYE+1      'saniye değeri bir artırılıyor

    If SANIYE=60 Then    'saniye 60 olmuş ise 1 dakika süre geçti o halde
                         '60x 2000 ms 1 dakika yapar mı?
    
        SANIYE=0         ' saniye sıfırlanıyor
        GoSub ATESLE     ' ateşle alt menüsüne git
                         '
    EndIf
    High LED             ' ledi yak      Sayaç 61 oldukça buraya gelir ve  LED  yanar LED i söndüremiyorsun
    PAUSE 2000           '2000 ms bekle  
EndIf

GoTo BASLA           'başla etiketine dön

kaganayanoglu

https://www.picproje.org/index.php/topic,8017.msg50400.html#msg50400

topicten yola çıkmaya çalıştım.

Benim işlemcimde 4 mhz dahili çalışıyor.

Kodu tekrar değiştirdim.
Alıntı Yap'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  :                                     *
'*  Notice  : Copyright (c) 2015                                *
'*          : All Rights Reserved                               *
'*  Date    : 5.3.2014                                          *
'*  Version : 1.02                                               *
'*  Notes   : 14.06.2016                                                  *
'*          : BOOM                                                  *
'*******************************************************************************

;----[16F88 Hardware Configuration]---------------------------------------------

;----[16F88 Hardware Configuration]---------------------------------------------
#CONFIG
cfg1 = _INTRC_IO              ; INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin
cfg1&= _WDT_OFF               ; WDT disabled
cfg1&= _PWRTE_ON             ; PWRT ENABLED
cfg1&= _MCLR_OFF              ; RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD
cfg1&= _BODEN_OFF              ; BOR enabled
cfg1&= _LVP_OFF               ; RB3 is digital I/O, HV on MCLR must be used for programming
cfg1&= _CPD_OFF               ; Code protection off
cfg1&= _WRT_PROTECT_OFF       ; Write protection off
cfg1&= _DEBUG_OFF             ; In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins
cfg1&= _CCP1_RB0              ; CCP1 function on RB0
cfg1&= _CP_ALL                ; 0000h to 0FFFh code-protected (all protected)
  __CONFIG _CONFIG1, cfg1

cfg2 = _FCMEN_OFF             ; Fail-Safe Clock Monitor disabled
cfg2&= _IESO_OFF              ; Internal External Switchover mode disabled
  __CONFIG _CONFIG2, cfg2

#ENDCONFIG

DEFINE OSC 4
DEFINE ADC_BITS 10      ' ADCIN resolution  (Bits)   
DEFINE ADC_CLOCK 3      ' ADC clock source  (Fosc/8)   
DEFINE ADC_SAMPLEUS 20  ' ADC sampling time (uSec)

ANSEL  = %00000011  ' AN0,AN1 ANALOG, DİĞERLERİ DİJİTAL, 
ADCON1 = %10000000  ' 1024 (10 BİT) hesaplanacak, (VREF+ vref+) (VREF-AVSS)
OSCCON = %01101110  ' İNTERNAL OSİLATÖRÜ 4mhz' E AYARLA
CMCON  = 7           'komparatör pinleri iptal hepsi giriş çıkış   
TRISA  = %00000001   ' RA0 GİRİŞ, DİĞERLERİ ÇIKIŞ   
TRISB  = %00011110   ' B1,B2,B3,B4 GİRİŞ
PORTA  = 0           ' PORTA SIFIRA ÇEK   
PORTB  = 0           ' PORTB SIFIRA ÇEK                                               

'---------------------------PİN AYARLARI----------------------------------------   
LED   VAR PORTA.2
GAS   VAR PORTA.3   
SHOCK VAR PORTA.4
AYAR  VAR PORTA.0
LDR   VAR PORTA.1
PAUSE 10

SAYAC  VAR word
SANIYE VAR WORD

Pause 100 ' 100 ms AÇILIŞ GECİKMESİ
HIGH LED
PAUSE 300
LOW LED
pause 300
HIGH LED
PAUSE 300
LOW LED
pause 300
HIGH LED
PAUSE 300
LOW LED
pause 300
CLEAR  'tüm değişkenler sıfırlandı



BASLA:
GOSUB ON_SN          ' YAKLAŞIK 10 SN BEKLE
PAUSE 1
GOSUB ATESLE         ' ateşle alt menüsüne git
pause 1
GOSUB ELLI_SN        ' YAKLAŞIK 50 SN BEKLE
PAUSE 1
GOSUB ATESLE         ' ateşle alt menüsüne git
GOTO BASLA           ' başla etiketine dön

ON_SN:

SAYAC=SAYAC+1
IF SAYAC=61 THEN     'sayac 61 olmuş ise 1 saniye süre geçti o halde
    SAYAC=0           'sayaç sıfırlanıyor
SANIYE=SANIYE+1       'saniye değeri bir artırılıyor
   IF SANIYE=10 THEN  'saniye 10 olmuş ise 10 SN süre geçti o halde
      SANIYE=0        'saniye sıfırlanıyor
ENDIF
   ENDIF              'GELDİĞİN YERE GERİ DÖN
RETURN

ELLI_SN:

SAYAC=SAYAC+1
IF SAYAC=61 THEN     'sayac 61 olmuş ise 1 saniye süre geçti o halde
    SAYAC=0           'sayaç sıfırlanıyor
SANIYE=SANIYE+1       'saniye değeri bir artırılıyor
   IF SANIYE=50 THEN  'saniye 50 olmuş ise 50 SN süre geçti o halde
      SANIYE=0        'saniye sıfırlanıyor
ENDIF
   ENDIF
RETURN                'GELDİĞİN YERE GERİ DÖN


ATESLE:
HIGH LED
PAUSE 200
LOW LED
PAUSE 200
HIGH LED
PAUSE 200
LOW LED
PAUSE 200

HIGH GAS
PAUSE 1000
LOW GAS
PAUSE 10

HIGH SHOCK
PAUSE 200
LOW SHOCK
PAUSE 10
return               
     

Bu kodda da hiç beklemeden doğrudan ateşle menüsüne gidiyor. Arka arkaya ateşle menüsünü çalıştırıyor.
Şu kesme olayını bir türlü kavrayamadım. :(


ferit06

#3
Senin programın ile vermiş olduğun topicteki hiç biririyleriyle ilgili değiller. Senin programında;
BASLA:
GoSub ON_SN          ' YAKLAŞIK 10 SN BEKLE  /diyorsun da 10 sn bekliyor mu?)
PAUSE 1
GoSub ATESLE         ' ateşle alt menüsüne git
pause 1
GoSub ELLI_SN        ' YAKLAŞIK 50 SN BEKLE
PAUSE 1
GoSub ATESLE         ' ateşle alt menüsüne git
GoTo BASLA           ' başla etiketine dön



ON_SN:

SAYAC=SAYAC+1         ' Bu toplama işlemi 1 kaç uSn sürer
If SAYAC=61 Then     'sayac 61 olmuş ise 1 saniye süre geçti o halde
                       ' Bu sorgulama da bir kaç uSn sürer
    SAYAC=0           'sayaç sıfırlanıyor
    SANIYE=SANIYE+1       'saniye değeri bir artırılıyor  ' Bu toplama işlemi 1 kaç uSn sürer
    If SANIYE=10 Then  'saniye 10 olmuş ise 10 SN süre geçti o halde
                        ' Bu sorgulama da bir kaç uSn sürer
      SANIYE=0        'saniye sıfırlanıyor
    EndIf
EndIf              'GELDİĞİN YERE GERİ DÖN      Yaklaşık 20 uSn sonra Pause 1 yazdığı yere gider
Return                 'sonra tabiki Gosub ATESLE çalışacak.


Vermiş olduğun topicte SAYAC kesme içerisinde arttırılyor. Kesme ise TMR0 a göre çalışıyor.

IF/ENDIF deyimlerini düzeltmiş olduğum gibi girintili olarak yazarsan IF lerin takibi daha kolay olur.

Vermiş olduğun topici iyi incele ...