İyi çalışmalar,
Proğram dht22 ile ısı ve nem okuma ile ilgili.ısı ve nemi kontrol için basit menü sistemi oluşturdum.Fakat donanımsal kesmeyi bir türlü çalıştıramadım.proğram bazı satırlarını iptal ettiğim zaman problemsiz çalışıyor.Misal Set_Hassasiyet etiketindeki butonlarla ilgili kısmı iptal ettiğim zaman kesme çalışıyor bu kısmı aktif ettiğim zaman kesme oluşmuyor ve zaman çalışmıyor.hata, proğramın genel akışıylamı ilgili yoksa kesmeninin oluşturulmasıylamı ilgili bilemedim ve işin içinden çıkamadım malesef.
Device = 16F88
@CONFIG_REQ
@__CONFIG _CONFIG1, INTRC_IO & WDT_OFF & PWRTE_ON & MCLR_OFF & BODEN_OFF & LVP_OFF & WRT_PROTECT_OFF & CP_OFF & CPD_OFF & DEBUG_OFF
Xtal 4
OSCCON=%01101100
TRISA=%00000000
TRISB=%11100000
PORTA=0
PORTB=0
INTCON=%10100000 'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
OPTION_REG=%00000101 'pull-up dirençleri aktif, bölme oranı 1/64
On_Hardware_Interrupt GoTo KESME
CMCON =7
ANSEL=0
Declare All_Digital TRUE
Declare LCD_DTPin PORTB.0 ' LCD Data Pin
Declare LCD_RSPin PORTB.4 ' LCD RS Pin
Declare LCD_ENPin PORTA.4 ' LCD EN Pin
Declare LCD_Lines 2 ' LCD Satır
Declare LCD_Interface 4 ' LCD Data Pin Sayısı 4
Symbol dTa =PORTA.3
Symbol motor_role =PORTA.0
Symbol lamba_role =PORTA.6
Symbol nem_role =PORTA.7
Symbol buzer =PORTA.2
Symbol menu =PORTB.6
Symbol asagi =PORTB.7
Symbol yukari =PORTB.5
Symbol lcd_led =PORTA.1
Print $FE,$40,$00,$15,$0E,$1F,$0E,$15,$00,$00 ' *
Print $FE,$48,$0F,$00,$0F,$10,$17,$11,$0F,0 'Ğ dataları--1
Print $FE,$50,$0A,$00,$11,$11,$11,$11,$0E,0 'Ü dataları--2
Print $FE,$58,$0F,$10,$10,$0E,$01,$05,$1E,$00 'Ş dataları--3
Print $FE,$60,4,0,4,4,4,4,4,0 'İ dataları--4
Print $FE,$68,$0A,$0,$0E,$11,$11,$11,$0E,0 'Ö dataları--5
Print $FE,$70,$0E,$11,$10,$10,$11,$0E,$04 'Ç dataları--6
Print $FE,$78,$40,$00,$0C,$04,$04,$04,$0E,$00,0 'ı dataları--7
Print $FE, 1 ; clear di
Dim Y As Byte
Dim I As Byte
Dim TaMrUt As Word
Dim OnDaRuT As Byte
Dim tAmIsI As Word
Dim OnDaIsI As Byte
Dim cOnTroL As Byte
Dim saat As Byte
Dim dakika As Byte
Dim saniye As Byte
Dim isi As Word 'tam-ısı ve onda-ısı bu değişkende tutuluyor
Dim nem As Word 'tam-nem ve onda-nem bu değişkende tutuluyor
Dim isi_set As Word 'set edilecek isi değeri
Dim nem_set As Word 'set edilecek nem değeri
Dim isi_set_tam As Byte 'set edilecek isi değerinin tam kısmı
Dim isi_set_onda As Byte 'set edilecek isi değerinin onda kısmı
Dim nem_set_tam As Byte 'set edilecek nem değerinin tam kısmı
Dim nem_set_onda As Byte 'set edilecek nem değerinin onda kısmı
Dim a_don_zamani As Byte
Dim a_don_suresi As Byte
Dim zmn As Byte
Dim poz As Bit
Dim lcd_sn1 As Byte
Dim sayac As Byte
Dim lcd_sn As Byte
Dim a As Byte
Dim ayr As Byte
Dim x As Word
Dim isi_hassasiyet As Byte
Dim nem_hassasiyet As Byte
a=0
ayr=0
poz=0
buzer=0
sayac=0
saat=0
dakika=59
saniye=50
lcd_sn=0
lcd_sn1=0
lamba_role=0
motor_role=0
nem_role=0
''''''''--------------------------------------------------------------------
isi_set.LowByte=ERead 1
isi_set.HighByte=ERead 2
If isi_set=65535 Then isi_set=300
nem_set.LowByte=ERead 3
nem_set.HighByte=ERead 4
If nem_set=65535 Then nem_set=700
isi_set_tam=ERead 5
If isi_set_tam=255 Then isi_set_tam=50
isi_set_onda=ERead 6
If isi_set_onda=255 Then isi_set_onda=10
isi_hassasiyet=ERead 9
If isi_hassasiyet=255 Then isi_hassasiyet=2
'''''----------------------------------------------------------------------------------------------
buzer=0
GIRIS:
GoSub TEMIZLE
GoSub EKRAN
BASLA:
GoSub SeNsOROkU
GoSub ARK_SONDURR
GoSub EKRAN
' DelayMS 600
''''-----------------------------------------------------------------------------
If zmn>50 Then 'MENÜ TUŞ GECİKMESİ
buzer=0
poz=1
lcd_sn1=0
GoSub TEMIZLE
GoTo ANA_MENU
EndIf
GoTo BASLA
EKRAN:
Print At 1,1,Dec2 TaMrUt ,".",Dec1 OnDaRuT," RH "
Print At 1,11,Dec2 tAmIsI,".",Dec1 OnDaIsI ," C "
Print At 2,1,Dec2 saat,":",Dec2 dakika,":",Dec2 saniye
GoSub ARK_SONDURR
Return
TEMIZLE:
Cls
Return
BIPBIP:
High buzer
DelayMS 50
Low buzer
DelayMS 100
High buzer
DelayMS 50
Low buzer
Return
BIP:
High buzer
For x=0 To 3000 '1000
Next x
Low buzer
Return
KAYDET:
Print At 1,1,"AYARLAR"
Print At 2,1,"KAYDEDILIYOR...."
' EWrite 1,[isi_set.LowByte]
' DelayMS 10
' EWrite 2,[isi_set.HighByte]
' DelayMS 10
' EWrite 3,[nem_set.LowByte]
' DelayMS 10
' EWrite 4,[nem_set.HighByte]
' DelayMS 10
' EWrite 5,[isi_set_tam]
' DelayMS 10
' EWrite 6,[isi_set_onda]
' DelayMS 10
' EWrite 7,[nem_set_tam]
' DelayMS 10
' EWrite 8,[nem_set_onda]
' DelayMS 10
' EWrite 9,[isi_hassasiyet]
' DelayMS 10
' EWrite 10,[a_don_zamani]
' DelayMS 10
' EWrite 11,[a_don_suresi]
GoSub BIPBIP
DelayMS 3000
a=0
poz=0
lcd_sn=0
lcd_sn1=0
ayr=0
zmn=0
GoSub TEMIZLE
GoTo BASLA
ANA_EKRAN:
GoSub BIPBIP
ayr=0
a=0
poz=0
lcd_sn=0
lcd_sn1=0
GoSub TEMIZLE
GoTo GIRIS
AYARLANDI:
Print At 1,1,"AYARLANDI... "
Print At 2,1," "
GoSub BIP
lcd_sn1=0
DelayMS 1000
ANA_MENU:
If yukari=0 Then
lcd_sn1=0
GoSub ARK_SONDUR
ayr=ayr+1
GoSub BIP
While yukari=0
Wend
If ayr>5 Then ayr=0
EndIf
If asagi=0 Then
lcd_sn1=0
GoSub ARK_SONDUR
lcd_sn1=0
ayr=ayr-1
GoSub BIP
While asagi=0
Wend
If ayr=255 Then ayr=5
EndIf
GoTo DURUM
GoTo ANA_MENU
DURUM:
Select Case ayr
Case 0
Print At 1,1," ISI AYARLAMA "
If lcd_sn1>10 Then GoTo ANA_EKRAN
If menu=0 Then
GoSub ARK_SONDUR
a=a+1
While menu=0
Wend
EndIf
If a>1 Then
GoSub BIP
GoTo SET_ISI
EndIf
Case 1
Print At 1,1," NEM AYARI "
Print At 2,1," "
If lcd_sn1>10 Then GoTo ANA_EKRAN
If menu=0 Then
GoSub ARK_SONDUR
While menu=0
Wend
GoSub BIP
GoTo SET_NEM
EndIf
Case 2
Print At 1,1,"HASSAS",4,"YET AYARI"
Print At 2,1," "
If lcd_sn1>10 Then GoTo ANA_EKRAN
If menu=0 Then
GoSub ARK_SONDUR
While menu=0
Wend
GoSub BIP
GoTo SET_HASSASIYET
EndIf
Case 3
Print At 1,1," MOTOR KA",6," "
Print At 2,1," SAATTE D",5,"NECEK "
If lcd_sn1>10 Then GoTo ANA_EKRAN
If menu=0 Then
GoSub ARK_SONDUR
While menu=0
Wend
GoSub BIP
GoTo SET_DONDURME_ZAMANI
EndIf
Case 4
Print At 1,1," MOTOR ",6,"EV",4,"RME "
Print At 2,1," "
If lcd_sn1>10 Then GoTo ANA_EKRAN
If menu=0 Then
GoSub ARK_SONDUR
While menu=0
Wend
GoSub BIP
' GoTo SET_DONDURME_SURESI
EndIf
Case 5
Print At 1,1," MEN",2,"DEN ",6,"IKI",3," "
Print At 2,1," "
If lcd_sn1>10 Then GoTo ANA_EKRAN
If menu=0 Then
GoSub ARK_SONDUR
While menu=0
Wend
GoSub TEMIZLE
GoTo KAYDET
EndIf
End Select
GoTo ANA_MENU
GoTo TEMIZLE
SET_ISI:
If lcd_sn1>10 Then GoTo ANA_EKRAN
Print At 1,1," ISI AYARLAMA "
isi_set_tam=isi_set/10
isi_set_onda=isi_set//10
Print At 2,6,Dec2 isi_set_tam,".",Dec1 isi_set_onda
If yukari=0 Then
lcd_sn1=0
isi_set=isi_set+1
If isi_set>500 Then isi_set=500
GoSub BIP
While yukari=0
Wend
EndIf
If asagi=0 Then
lcd_sn1=0
isi_set=isi_set-1
If isi_set=65535 Then isi_set=0
GoSub BIP
While asagi=0
Wend
EndIf
If menu=0 Then
ayr=5
GoTo AYARLANDI
GoSub BIP
EndIf
GoTo SET_ISI
SET_NEM:
If lcd_sn1>9 Then GoTo ANA_EKRAN
Print At 1,1," NEM AYARI "
nem_set_tam=nem_set/10
nem_set_onda=nem_set//10
Print At 2,6,Dec2 nem_set_tam,".",Dec1 nem_set_onda," %"
If yukari=0 Then
lcd_sn1=0
nem_set=nem_set+1
If nem_set>1000 Then nem_set=1000
GoSub BIP
While yukari=0
Wend
EndIf
If asagi=0 Then
lcd_sn1=0
nem_set=nem_set-1
If nem_set=65535 Then nem_set=0
GoSub BIP
While asagi=0
Wend
EndIf
If menu=0 Then
ayr=5
GoTo AYARLANDI
GoSub BIP
EndIf
GoTo SET_NEM
SET_HASSASIYET:
If lcd_sn1>9 Then GoTo ANA_EKRAN
Print At 1,1,"HASSAS",4,"YET AYARI"
Print At 2,8,Dec2 isi_hassasiyet
'If yukari=0 Then
' lcd_sn1=0
' isi_hassasiyet=isi_hassasiyet+1
' If isi_hassasiyet>30 Then isi_hassasiyet=30
' GoSub BIP
' While yukari=0
' Wend
'EndIf
'If asagi=0 Then
' lcd_sn1=0
' isi_hassasiyet=isi_hassasiyet-1
' If isi_hassasiyet=255 Then isi_hassasiyet=0
' GoSub BIP
' While asagi=0
' Wend
'EndIf
' If menu=0 Then
' ayr=5
' GoTo AYARLANDI
' GoSub BIP
' EndIf
GoTo SET_HASSASIYET
SET_DONDURME_ZAMANI:
If lcd_sn1>9 Then GoTo ANA_EKRAN
Print At 1,1," DONDURME SAATI"
Print At 2,1," ",Dec2 a_don_zamani," SAAT "
If yukari=0 Then
lcd_sn1=0
a_don_zamani=A_DON_ZAMANI+1
If a_don_zamani>23 Then a_don_zamani=23
GoSub BIP
While yukari=0
Wend
EndIf
If asagi=0 Then
lcd_sn1=0
a_don_zamani=A_DON_ZAMANI-1
If a_don_zamani=0 Then a_don_zamani=1
GoSub BIP
While asagi=0
Wend
EndIf
If menu=0 Then
ayr=5
GoTo AYARLANDI
GoSub BIP
EndIf
GoTo SET_DONDURME_ZAMANI
SeNsOROkU:
INTCON.7=0
Output dTa
dTa =1 '1
DelayUS 5
dTa =0 '0
DelayMS 5 '1-10 ms bekle
dTa =1 'Data pinini High yap
DelayUS 40 '40 us bekle
Input dTa
DelayUS 5
While dTa =0
Wend
DelayUS 80
If dTa =1 Then HaTa
TaMrUt=0
For I=15 To 0 STEP-1 'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
While dTa =0
Wend
DelayUS 30
If dTa =1 Then LoadBit TaMrUt,I,1
'----------------------------------------------------------------------------------------
If dTa=1 Then
SetBit TaMrUt,I
EndIf
'-----------------------------------------------------------------------------------------
While dTa =1
Wend
Next
tAmIsI=0
For I=15 To 0 STEP-1 'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
While dTa=0
Wend
DelayUS 30
If dTa=1 Then LoadBit tAmIsI,I,1
'--------------------------------------------------------------------------------------------
If dTa=1 Then
SetBit tAmIsI,I
EndIf
'-------------------------------------BURASI ----------------------------------------------------------
While dTa =1
Wend
Next
cOnTroL=0
For I=7 To 0 STEP-1 '7 de hata veriyo.MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
While dTa =0
Wend
DelayUS 30
If dTa=1 Then LoadBit cOnTroL,I,1
'-----------------------------------------------------------------------------------------
If dTa=1 Then
SetBit cOnTroL,I
EndIf
'-------------------------------BURASI SORUNLU-------------------------------------------
While dTa =1
Wend
'''---------------------------------------------------------------------------------------
Next
Output dTa
dTa=0
isi=OnDaIsI
isi=tAmIsI
nem=OnDaRuT
nem=TaMrUt
OnDaRuT=TaMrUt//10
TaMrUt =TaMrUt /10
OnDaIsI=tAmIsI//10
tAmIsI =tAmIsI /10
INTCON.7=1
Return
HaTa:
Print At 1,12," "
Print At 1,1,"S E N S O R"
Print At 2,1," "
Print At 2,6,"H A T A S I"
' DelayMS 1000
GoTo SeNsOROkU
ARK_SONDUR:
For I = 1 To 10
DelayMS 3
Next I
Return
ARK_SONDURR:
For Y = 1 To 100 '100
DelayMS 4
Next Y
Return
KESME:
Context Save
If poz=0 Then
If menu=0 Then 'MENU BUTON GECİKMESİ İÇİN
zmn=zmn+1
buzer=1
lcd_sn=0
' lcd_led=1
Else
buzer=0
zmn=0
EndIf
EndIf
sayac=sayac+1
If sayac<50 Then GoTo CIK ' 61 5 OLACAK 08:44 DONUYOR 02:37 OLABİLİR
sayac=0
saniye=saniye+1
lcd_sn=lcd_sn+1
lcd_sn1=lcd_sn1+1
If saniye >= 60 Then
saniye=0
dakika=dakika+1
If dakika >= 60 Then
dakika=0
saat=saat+1
If saat >= 24 Then
saat=0
EndIf
EndIf
EndIf
CIK:
INTCON.2=0
Context Restore
End
Tüm dosyalar linkte.
http://s7.dosya.tc/server7/8xhf9n/16F88.rar.html
Proton bilmiyorum ama biraz PicBasic'e benziyor gibi..Yanlış anlamayın tereciye tere satmak gibi olmasın da onda KESME etiketinden önce DISABLE, sonunda RESUME..ENABLE oluyordu...buna benzer şeyler Proton'da var mı ?
Alıntı yapılan: mg1980 - 01 Temmuz 2018, 00:27:43Proton bilmiyorum ama biraz PicBasic'e benziyor gibi..Yanlış anlamayın tereciye tere satmak gibi olmasın da onda KESME etiketinden önce DISABLE, sonunda RESUME..ENABLE oluyordu...buna benzer şeyler Proton'da var mı ?
estağfirullah,o söyledikleriniz picbasic için doğru.fakat protonda donanımsal kesme özelliği var normal kesmeden farklı olarak.bende protonu yeni yeni kullanıyorum o yüzden kesme oluşturmada bir eksiğim olabilir belki diye düşünüyorum.
Kesmeye girip girmediğini kontrol için kesme içinde bir çıkış portunu toggle yapıp yada lcd ekranına bir kesme içi sayıcı yerleştirip anlayabilirsiniz.Önceden sorun olmayıpta kodlar eklendikçe sorun oldu ise eklenen kodları inceleseniz daha iyi olur.
Protonu yeni yeni kullanıyorum ve çok fazla tecrübem yok malesef.Şöyle bir ilginçlik var,sanki satır sayısında bir kısıltlama var.yada bir kapasitesi varda onu geçtiğinde kesme oluşmuyor.satırların bir çoğunu pasif hale getirdim ve saniye saymaya başladı(yani kesme oluşuyor)sonra satırları tek tek aktif ederek denedim.en son satırlardan bir tanesini aktif ettiğim zaman kesme oluşmuyor vede saniye saymıyor.bu sefer proğramın herhangi bir satırını(proğramın akışını aksatmayacak bir satırı)pasif hale getirip derleme yapıp deniyorum saniye sayıyor(kesme çalışıyor)sanki çalıştığı anda kaç satır aktifse ondan sonraki satır yada satırlarda kesme oluşmuyor.Çok tuhaf bir durum gerçekten,uzman arkadaşlardan ve hocalarımdan yardım bekliyorum.
F.T hocam,
söylediğiniz gibi kesme içinde sayaç çalıştırdım ve ona bağlı saniye-dakika-saat şeklinda sayıcı çalıştırarak kesmenin oluşup oluşmadığını anlıyorum.eklenen kodları çok inceledim ama bir sorun bulamadım malesef ve sıkışıp kaldım.
Hocam derleyici hatasıda olabilir.Sensör okuma kısmında INTCON.5 Bitinide müdahale ettim.Sürüm 3.6.0.7 ile derledim lcd ekranda saatte bir takılma görmedim.Deneyin isterseniz.Bu arada simülasyonda yanıltabilir.
http://s7.dosya.tc/server7/lb7qzf/16F88.rar.html
F.T hocam,
hata dediğiniz gibi derleyiciden çıktı.benim sürüm çok eski imiş.sizin sürüme yükselttim sorun çözüldü.şimdi herşey olması gerektiği gibi çalışıyor.İyi çalışmalar.
Sevindim.Iyi çalışmalar.