'****************************************************************
'* 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? :-\
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
https://www.picproje.org/index.php/topic,8017.msg50400.html#msg50400 (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. :(
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 ...