avatar_anlhlc

PIC16F877A Kesme Hk.

Başlatan anlhlc, 20 Nisan 2017, 15:26:12

anlhlc

Arkadaşlar , ete hocam merhaba,
Bir projem var bu proje ortam ısısını ve nem değerlerini alarak röleleri aktif veya deaktif ediyor. Bazı röleler zamana göre çalışacak bu yüzden kesme tipi bir saat ile bunu gerçekleştirmeyi düşündüm fakat program dht22 okuma bölümüne geldiğinde ekranda hiçbirşey gözükmüyor. DHT22 bölümünü iptal ettiğimde kesme yapıyor saat ve ds18b20 verisini görebiliyorum. Kodlar aşağıda yardımcı olursanız cok sevinirim.

@ DEVICE pic16F877A                      'işlemci 16F877A                             
@ DEVICE pic16F877A, WDT_OFF              'Watch Dog timer açık
@ DEVICE pic16F877A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F877A, PROTECT_OFF         'Kod Protek kapalı
Include "MODEDEFS.BAS"

ADCON1=7
DEFINE OSC 4


DEFINE LCD_DREG PORTD 'LCD DATA BACAKLARI PORTB'YE BAGLI
DEFINE LCD_DBIT 4 'LCD DATA BITLERI HANGİ BITTEN BASLIYOR
DEFINE LCD_EREG PORTD 'LCD ENABLE BACAGI HANGI PORTA BAGLI
DEFINE LCD_EBIT 1 'LCD ENABLE BITI HANGI PORTA BAGLI
DEFINE LCD_RWREG PORTD 'LCD RW BACAGI HANGI PORTA BAGLI
DEFINE LCD_RWBIT 2 'LCD RW BACAGI HANGI BITE BAGLI
DEFINE LCD_RSREG PORTD 'LCD RS BACAGI HANGI PORTA BAGLI
DEFINE LCD_RSBIT 3 'LCD RS BACAGI HANGI BITE BAGLI
DEFINE LCD_BITS 4 'LCD 4 BIT BAGLI
DEFINE LCD_LINES 4 'LCD KAC SIRADAN OLUSUYOR
ON INTERRUPT GoTo KESME 
OPTION_REG=%10000101
INTCON=%10100000
TMR0=0


TrisA=%00000000
TrisB=%00000000
TrisC=%00000000
TrisD=%00000000
TrisE=%111


PortA=0
PortB=0
PORTC=0
PORTD=0
PORTE=0
 
'***********Sensör Tanımlamaları***********

SYMBOL DS18B20=PORTA.1  'DS18B20 PORTA.0 E BAĞLI
symbol DHT22=PORTb.7  'DHT22 PORTA.1 E BAĞLI
symbol SEC=PORTE.1
SYMBOL ARTTIR=PORTE.0
SYMBOL AZALT=PORTE.2
SYMBOL ISITMA=PORTC.1
SYMBOL NEM=PORTC.2
SYMBOL FAN=PORTC.4
SYMBOL NEMFAN=PORTC.3
SYMBOL MOTOR=PORTC.0

SAYAC VAR BYTE
SN VAR BYTE
DAK VAR BYTE
SAAT VAR BYTE
Busy        VAR BIT
HAM         VAR WORD
ISI           VAR WORD
SIGN        VAR BYTE
SIGN_BITI   VAR HAM.Bit11
NEGAT_ISI   CON 1
TEMP        VAR BYTE
Float        VAR WORD
SURE       VAR byte
I              VAR BYTE
TAMRUT   VAR WORD
ONDARUT VAR BYTE
TAMISI     VAR WORD
ONDAISI   VAR BYTE
CONTROL var byte
DERECE  CON 223     ' ° işareti
MAXTAMISI VAR BYTE
MAXONDAISI VAR BYTE
MAXNEM VAR BYTE
GUN VAR BYTE
AY VAR BYTE
CLEAR
PORTD.2=0

lcdout $FE,1
PAUSE 200   ' LCD nin kullanıma hazır hale gelebilmesi için gerekli süre
READ 1,MAXTAMISI
READ 2,MAXONDAISI
READ 3,MAXNEM
READ 4,GUN
READ 5,AY
PAUSE 50


  gosub DS18B20OKU
  PAUSE 100
  GOSUB DHT22OKU
  PAUSE 100
   IF MAXTAMISI>100 THEN MAXTAMISI=37
   IF MAXONDAISI>100 THEN MAXONDAISI=0
   IF MAXNEM>90 THEN MAXNEM=60






BASLA:

WHILE SEC=1
    LCDOUT $FE,1
    pause 200
     GOTO MAXSICAYAR   
WEND
    GOSUB DHT22OKU
      pause 500
    gosub DS18B20OKU
    pause 500
    GOSUB CIKISAYAR
    GOSUB EKRAN
      GOTO BASLA
       
     
      DHT22OKU:
     
      output DHT22
           DHT22=1:PAUSEUS 5
           DHT22=0
           pause 5      '1-10 ms bekle
           DHT22=1         'Data pinini High yap
           Pauseus 40      '40 us bekle
           INPUT DHT22
           PAUSEUS 5
           WHILE DHT22=0:WEND
           PAUSEUS 80

         IF DHT22=1 then GOTO DHT22_HATA

          TAMRUT=0
          FOR I=15 TO 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
             WHILE DHT22=0:WEND 
             PAUSEUS 30
             IF DHT22=1 THEN TAMRUT.0[I]=1
             WHILE DHT22=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 DHT22=0:WEND
             PAUSEUS 30
             IF DHT22=1 THEN TAMISI.0[I]=1
             WHILE DHT22=1:WEND
           NEXT
         
          CONTROL=0
          FOR I=7 TO 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
             WHILE DHT22=0:WEND
             PAUSEUS 30
             IF DHT22=1 THEN CONTROL.0[I]=1
             WHILE DHT22=1:WEND
           NEXT
          OUTPUT DHT22
          DHT22=0
          ONDARUT=TAMRUT//10:TAMRUT=TAMRUT/10
          ONDAISI=TAMISI//10:TAMISI=TAMISI/10
     
      RETURN
      DS18B20OKU:
     
   
           OWOUT   DS18B20, 1, [$CC, $44]' ISI değerini oku
         
             Pauseus 40
Bekle:
           OWIN    DS18B20, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   DS18B20, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    DS18B20, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           
           GOSUB   Hesapla
           RETURN
   
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-" 
       temp=($ffff-ham+1)*625
       ISI  = DIV32 10
       Pauseus 40
       GOTO GEC   
    endif
    TEMP = 625 * (HAM+1)        '
    ISI = DIV32 10          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
    FLOAT = (ISI //1000)/100
    ISI=(ISI/1000)
    IF ISI>=65 then GOTO DS18B20_HATA
             
    RETURN
    MAXSICAYAR:
    WHILE SEC=1:WEND 
    LCDOUT  $FE,$82,"MAX. SICAKLIK"
    LCDOUT $FE,$C6,DEC2 MAXTAMISI,".", DEC MAXONDAISI
    IF ARTTIR=1 THEN
       MAXONDAISI=MAXONDAISI+1
      PAUSE 500
    ENDIF
 
   IF MAXONDAISI>9 THEN
      MAXTAMISI=MAXTAMISI+1
      MAXONDAISI=0
   ENDIF

   IF AZALT=1 THEN
      MAXONDAISI=MAXONDAISI-1
     PAUSE 500
   ENDIF
 
   IF MAXONDAISI=255 THEN
      MAXONDAISI=9
      MAXTAMISI=MAXTAMISI-1
   ENDIF
   IF MAXTAMISI>50 THEN MAXTAMISI=50


    IF SEC=1 THEN
      LCDOUT $FE,1
      pause 200
     GOTO MAXNEMAYAR
   ENDIF

  GOTO MAXSICAYAR


'****************NEM AYAR*********************************     
MAXNEMAYAR:
     WHILE SEC=1:WEND
     LCDOUT  $FE,$84,"MAX. NEM"
     LCDOUT $FE,$C6,DEC2 MAXNEM," %"   
     IF ARTTIR=1 THEN
        MAXNEM=MAXNEM+1
        PAUSE 500
     ENDIF

     IF AZALT=1 THEN
        MAXNEM=MAXNEM-1
        PAUSE 500
     ENDIF

     IF MAXNEM=255 THEN MAXNEM=80
     IF MAXNEM>80 THEN MAXNEM=0
 
     IF SEC=1 THEN
         LCDOUT $FE,1
         pause 200
         GOTO GUNAYAR
     ENDIF
     GOTO MAXNEMAYAR
'****************GUN AYAR*********************************     
     GUNAYAR:
     WHILE SEC=1:WEND
     LCDOUT  $FE,$80,"BASLANGIC TARIHI"
     LCDOUT $FE,$C0,"GUN SECINIZ:",DEC2 GUN
     IF ARTTIR=1 THEN
        GUN=GUN+1
        PAUSE 500
     ENDIF

     IF AZALT=1 THEN
        GUN=GUN-1
        PAUSE 500
     ENDIF
     IF GUN>31 THEN GUN=1
     IF GUN=0 THEN GUN=31
 
     IF SEC=1 THEN
         LCDOUT $FE,1
         pause 200
         GOTO AYAYAR
     ENDIF
     GOTO GUNAYAR
'****************AY AYAR*********************************     
     AYAYAR:
     WHILE SEC=1:WEND
     LCDOUT  $FE,$80,"BASLANGIC TARIHI"
     LCDOUT $FE,$C0,"AY SECINIZ:",DEC2 AY
     IF ARTTIR=1 THEN
        AY=AY+1
        PAUSE 500
     ENDIF

     IF AZALT=1 THEN
        AY=AY-1
        PAUSE 500
     ENDIF
     IF AY>12 THEN AY=1
     IF AY=0 THEN AY=12
 
     IF SEC=1 THEN
         LCDOUT $FE,1
         pause 200
         GOTO AYARCIKIS
     ENDIF
     GOTO AYAYAR
     

'****************AYAR ÇIKIŞ*********************************
AYARCIKIS:
     LCDOUT  $FE,$82,"KAYDEDILIYOR"
      PAUSE 2000
WRITE 1,MAXTAMISI
PAUSE 10
WRITE 2,MAXONDAISI
PAUSE 10
WRITE 3,MAXNEM
PAUSE 10
WRITE 4,GUN
PAUSE 10
WRITE 5,AY
PAUSE 10
     LCDOUT $FE,1
     LCDOUT  $FE,$84,"AYARLAR"
     LCDOUT  $FE,$C3,"KAYDEDILDI"
     PAUSE 1000
     LCDOUT $FE,1
     pause 200
     GOTO BASLA
     
'****************HATA*********************************
DS18B20_HATA:
'LCDOUT $FE,1
'pause 200
GOSUB DHT22OKU
GOSUB EKRAN
LCDOUT $FE,$80,"ISI:",DEC TAMISI,".",DEC ONDAISI,0,"/NEM:",DEC TAMRUT
LCDOUT  $FE,$C0,"DS18B20 HATASI  "
GOTO BASLA
DHT22_HATA:
'LCDOUT $FE,1
'pause 200
GOSUB DS18B20OKU
GOSUB CIKISAYAR
GOSUB EKRAN
LCDOUT $FE,$C0,"ISI:",DEC isi,".",DEC (Float),0
LCDOUT  $FE,$80,"DHT22 HATASI    "
GOTO BASLA

CIKISAYAR:

IF ISI=MAXTAMISI AND FLOAT=MAXONDAISI THEN LOW ISITMA
IF ISI=MAXTAMISI AND FLOAT>MAXONDAISI THEN LOW ISITMA
IF ISI>MAXTAMISI THEN LOW ISITMA
IF ISI=MAXTAMISI AND FLOAT<MAXONDAISI THEN HIGH ISITMA
IF ISI<MAXTAMISI THEN HIGH ISITMA


IF TAMRUT<MAXNEM OR TAMRUT=MAXNEM THEN
     LOW FAN
     HIGH NEM
     HIGH NEMFAN
     ENDIF
     Pauseus 40
IF TAMRUT=MAXNEM+1 OR TAMRUT=MAXNEM+2 OR TAMRUT=MAXNEM+3 OR TAMRUT=MAXNEM+4  THEN
     LOW  FAN
     LOW NEM
     LOW NEMFAN
     ENDIF
     Pauseus 40
IF TAMRUT>MAXNEM+4 THEN
     HIGH FAN
     LOW NEM
     LOW NEMFAN   
     endif
     Pauseus 40
  RETURN
 
      EKRAN:
LCDOUT $FE,$80,"ISI:",DEC2 TAMISI,".",DEC ONDAISI,"/NEM:",DEC2 TAMRUT,".",DEC ONDARUT
LCDOUT $FE,$C0,"ISI:",DEC2 isi,".",DEC (Float),0,"/O:",DEC2 ((TAMISI*10)+(ISI*10)+(ondaisi+float))/2/10,".",DEC1 (((TAMISI*10)+(ISI*10)+(ondaisi+float))/2)//10'DEC (ONDAISI+FLOAT)/2'DEC2 GUN,"/",DEC2 AY
lcdout $FE,$94,"SET ISI/NEM:",DEC2 MAXTAMISI,".",DEC MAXONDAISI,"/",DEC2 MAXNEM
LCDOUT $FE,$D4,"SAAT:",dec2 saat,":",dec2 dak,":",dec2 sn
PAUSE 200
RETURN
DISABLE
KESME:

SAYAC=SAYAC+1

IF SAYAC=61 then
SAYAC=0
SN=SN+1

IF SN=60 THEN
SN=0
DAK=DAK+1

IF DAK=60 THEN
DAK=0
SAAT=SAAT+1

IF SAAT=24 THEN
SAAT=0
endif
ENDIF
ENDIF
ENDIF
INTCON.2=0
RESUME
ENABLE

END

anlhlc

21 kişi bakmış kimsenin bir fikri yok mu ?

POWER

isis dosyasını koysa idiniz daha iyi olurdu ama aşağıdaki başlığı incelemeni tavsiye ederim.
http://etepic.com/index.php/topic,3468.msg32867.html#msg32867

Hattuşa

hatanız kesme ile alakalı değil, bence kesme programınızı bi kenara koyun. önce siz DHT22 yi sağlıklı okuyacak hale getirin ekranda vs görün sonra okuma yaptığınız kısmı ana programınıza yerleştirin. yani sorununuzu paarçalaaraa ayıraraak çözemeye çalışın. DHT serisi sensörler biraz kasıntılıdır. okuması zordur. SHT gibi kolaay değildir. hala bir çözüm bulamazsanız yardımcı olalım

ete

#4
Dht sensörü zamana dayalı okunur. Okuma esnasında kesme gelirse okuma işlemi yarıda kalır.
Tavsiyem mümkünse bu programda kesme kullanmayın. Kullanmak bir zorunluluk ise iki kesme arasındaki süre sensörü okuma toplam süresinden fazla olmalıdır. Böylece bayrak set edilmeli ve aynı bayrak kesme içinde reset edilerek ana programda bayrak reset oluncaya kadar beklenip okuma işi yapılmalıdır.  Böylece program sonraki kesme gelmeden okuma işini bitirmiş olacaktır.
İşlem sırası şöyle olabilir.dht okuma başlangıcında,
Bayrak=1
While bayrak=1:wend
Dhta okuma bu satırdan başlamalı.
Unutmayın. Bayrak kesme içinde sıfırlanacak.
Ete

anlhlc

Oncelikle herkese teşekkürler sevgili Pro-TR kesmeyi ilave etmeden once saglikli bir sekilde dht22 yi okuyordum. Sorun ETE hocamin soyledigi sebepten olabilir deneyip son durumu paylasacagim. Saygılar

Powered by EzPortal