avatar_anlhlc

PIC16F877A Donma Problemi

Başlatan anlhlc, 04 Mayıs 2017, 10:10:18

anlhlc

Arkadaşlar ve Ete Hocam merhaba,
Yazdığım program ISIS simülasyonunda donuyor ve herhangi bir işlem yapmıyor.Acaba göremediğim bir hata mı yaptım yada pc den mi kaynaklanıyor anlamadım. Kodlarım aşağıda inceleyip yorum yazarsanız sevinirim. Bu arada programın amacı sera kontrolünü sağlamak 6 adet dijital toprak nem sensöründen gelen 1 veya 0 bilgisine göre gerekli elemanları aç kapa yapıyor. Ayrıca DHT22 sensöründen gelen sıcaklık bilgisine göre de fanları açıp kapatıyor.
Herkese şimdiden teşekkürler...

@ DEVICE pic16F877A, XT_OSC
@ DEVICE pic16F877A, WDT_OFF                                               
@ DEVICE pic16F877A, PWRT_OFF         
@ DEVICE pic16F877A, BOD_OFF
@ DEVICE pic16F877A, LVP_OFF
@ DEVICE pic16F877A, CPD_OFF
@ DEVICE pic16F877A, PROTECT_OFF
Include "MODEDEFS.BAS"


DEFINE OSC 4
CMCON=7

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4
LCDOUT $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0


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


PortA=0
PortB=0
PORTC=0
PORTD=0
PORTE=0

SYMBOL DHT22=PORTB.0
SYMBOL NS1=PORTD.1
SYMBOL NS2=PORTD.2
SYMBOL NS3=PORTD.3
SYMBOL NS4=PORTD.4
SYMBOL NS5=PORTD.5
SYMBOL NS6=PORTD.6
SYMBOL MTR=PORTC.0
SYMBOL VALF1=PORTC.1
SYMBOL VALF2=PORTC.2
SYMBOL FAN=PORTC.3
SYMBOL ARTTIR=PORTC.5
SYMBOL SEC=PORTC.6
SYMBOL AZALT=PORTC.7

I        VAR BYTE
TAMRUT   VAR WORD
ONDARUT  VAR BYTE
TAMISI   VAR WORD
ONDAISI  VAR BYTE
CONTROL  var byte
MAXTAMISI VAR BYTE
MAXONDAISI VAR BYTE
MAXNEM VAR BYTE


CLEAR
DERECE   CON 223   
LCDOUT,$FE,1
PAUSE 200
GOSUB DHT22OKU
PAUSE 1000

READ 1,MAXTAMISI
READ 2,MAXNEM
PAUSE 50
BASLA:
WHILE SEC=0
    LCDOUT $FE,1
    pause 200
     GOTO MAXSICAYAR   
WEND

GOSUB DHT22OKU
PAUSE 1000
GOSUB SORGU
PAUSE 1000
GOSUB EKRAN
PAUSE 1000

GOTO BASLA

DHT22OKU:
           output DHT22
           DHT22=1:PAUSEUS 5
           DHT22=0
           pause 5     
           DHT22=1       
           Pauseus 40     
           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 
             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 
             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 
             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
     
      DHT22_HATA:
       LCDOUT  $FE,$80,"ISI/NEM SENSORU HATA"
       PAUSE 1000
       GOTO BASLA
     
      SORGU:
      IF (NS1=1 AND NS2=1) OR (NS1=1 AND NS3=1) OR (NS2=1 AND NS3=1)  THEN 
      HIGH VALF1
      ELSE
      LOW VALF1
      ENDIF

      IF (NS4=1 AND NS5=1) OR (NS4=1 AND NS6=1) OR (NS5=1 AND NS6=1)  THEN 
      HIGH VALF2
      ELSE
      LOW VALF2
      ENDIF
     
      IF VALF1=1 OR VALF2=1 THEN
      HIGH MTR
      ELSE
      LOW MTR
      ENDIF
     
      IF TAMISI>=MAXTAMISI THEN
      HIGH FAN
      ELSE
      LOW FAN
      ENDIF
     
      RETURN
     
      MAXSICAYAR:
    WHILE SEC=0:WEND 
    LCDOUT  $FE,$82,"MAX. SICAKLIK"
    LCDOUT $FE,$C6,DEC2 MAXTAMISI,0,"C"
    IF ARTTIR=0 THEN
       MAXTAMISI=MAXTAMISI+1
      PAUSE 500
    ENDIF

   IF AZALT=0 THEN
      MAXTAMISI=MAXTAMISI-1
     PAUSE 500
   ENDIF
   IF MAXTAMISI>50 THEN MAXTAMISI=50


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

  GOTO MAXSICAYAR
AYARCIKIS:
     LCDOUT  $FE,$82,"KAYDEDILDI"
      PAUSE 2000
WRITE 1,MAXTAMISI
PAUSE 10
WRITE 2,MAXNEM
PAUSE 10
     LCDOUT $FE,1
     pause 200
     GOTO BASLA
     
   
     
      EKRAN:
      LCDOUT  $FE,$80,"ISI:",DEC2 TAMISI,"/NEM:",DEC2 TAMRUT,"/SET:",DEC2 MAXTAMISI
      LCDOUT  $FE,$C0,"NS1:",DEC1 NS1,"/NS2:",DEC1 NS2,"/NS3:",DEC1 NS3
      LCDOUT  $FE,$94,"NS4:",DEC1 NS4,"/NS5:",DEC1 NS5,"/NS6:",DEC1 NS6
      LCDOUT $FE,$D4,"MTR:",DEC1 MTR,"/V1:",DEC1 VALF1,"/V2:",DEC1 VALF2,"/FN:",DEC1 FAN
      RETURN
      END

ete

Görebildiğim tek hata aşağıdaki ama bir kaç tane GOSUB olunca sorunun bu olması kuvvetle ihtimal.
DHT22OKU etiketine Gosub ile geliyorsun ancak bir hata çıkarsa  IF DHT22=1 then GOTO DHT22_HATA komut satırı ile DHT22_HATA etiketine yönlendiriyorsun programı. Orada ise GOTO BASLA ile başa döndürüyorsun bu stack taşmasına sebep olur. Stack taşması ise programın donması demektir.
Bence bir bayrak kullan ve onu set edip geri dönülen yerde bayrak set ise hata etiketine gönder.

Birde hatayı hemen hata olarak görmemek gerekir. Bana kalırsa hata oluşumunuda saymak gerek. Örneğin bir hata oluştu diyelim. Sayac=Sayac+1 olsun Sayac>3 ise tekrar sensör okumaya gitsin program.
Hata sayısı 3 ise hatayı versinbu kalıcı hata anlamına geliyor artık.
Ete


anlhlc

hocam cevabınız için teşekkürler fakat program hata etiketine gitmiyor çünkü ekranda hata yazısı çıkmıyor bence başka bir problem olmalı anlayamadım.

ete

bu hatayı simulasyonda görüyorsan bende görmek isterim.
Ete

anlhlc

#4
dht22 den vazgeçtim ds18b20 kullandım ama yine de devam ediyor.
Tüm dosyalar ekte mevcut hocam

F®T

#5
@ DEVICE pic16F877A, XT_OSC
@ DEVICE pic16F877A, WDT_OFF                                               
@ DEVICE pic16F877A, PWRT_OFF         
@ DEVICE pic16F877A, BOD_OFF
@ DEVICE pic16F877A, LVP_OFF
@ DEVICE pic16F877A, CPD_OFF
@ DEVICE pic16F877A, PROTECT_OFF
Include "MODEDEFS.BAS"


DEFINE OSC 4
CMCON=7

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4
LCDOUT $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0


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


PortA=0
PortB=0
PORTC=0
PORTD=0
PORTE=0

SYMBOL DHT22=PORTB.0
SYMBOL NS1=PORTD.1
SYMBOL NS2=PORTD.2
SYMBOL NS3=PORTD.3
SYMBOL NS4=PORTD.4
SYMBOL NS5=PORTD.5
SYMBOL NS6=PORTD.6
SYMBOL MTR=PORTC.0
SYMBOL VALF1=PORTC.1
SYMBOL VALF2=PORTC.2
SYMBOL FAN=PORTC.3
SYMBOL ARTTIR=PORTC.5
SYMBOL SEC=PORTC.6
SYMBOL AZALT=PORTC.7

I        VAR BYTE
TAMRUT   VAR WORD
ONDARUT  VAR BYTE
TAMISI   VAR WORD
ONDAISI  VAR BYTE
CONTROL  var byte
MAXTAMISI VAR BYTE
MAXONDAISI VAR BYTE
MAXNEM VAR BYTE


CLEAR
DERECE   CON 223   
LCDOUT,$FE,1
PAUSE 200
GOSUB DHT22OKU
PAUSE 1000

READ 1,MAXTAMISI
READ 2,MAXNEM
PAUSE 50
BASLA:
WHILE SEC=0
    LCDOUT $FE,1
    pause 200
     GOTO MAXSICAYAR   
WEND

[s]GOSUB DHT22OKU[/s]
PAUSE 1000
GOSUB SORGU
PAUSE 1000
GOSUB EKRAN
PAUSE 1000

GOTO BASLA

DHT22OKU:
           output DHT22
           DHT22=1:PAUSEUS 5
           DHT22=0
           pause 5     
           DHT22=1       
           Pauseus 40     
           INPUT DHT22
           PAUSEUS 5
           WHILE DHT22=0:WEND
           PAUSEUS 80

          IF DHT22=1 then [s]GOTO DHT22_HATA[/s]

          TAMRUT=0
          FOR I=15 TO 0 STEP-1 
             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 
             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 
             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
     
      [s]DHT22_HATA:[/s]
       LCDOUT  $FE,$80,"ISI/NEM SENSORU HATA"
       PAUSE 1000
       [s]GOTO BASLA[/s]
     
      SORGU:
      IF (NS1=1 AND NS2=1) OR (NS1=1 AND NS3=1) OR (NS2=1 AND NS3=1)  THEN 
      HIGH VALF1
      ELSE
      LOW VALF1
      ENDIF

      IF (NS4=1 AND NS5=1) OR (NS4=1 AND NS6=1) OR (NS5=1 AND NS6=1)  THEN 
      HIGH VALF2
      ELSE
      LOW VALF2
      ENDIF
     
      IF VALF1=1 OR VALF2=1 THEN
      HIGH MTR
      ELSE
      LOW MTR
      ENDIF
     
      IF TAMISI>=MAXTAMISI THEN
      HIGH FAN
      ELSE
      LOW FAN
      ENDIF
     
      RETURN
     
      MAXSICAYAR:
    WHILE SEC=0:WEND 
    LCDOUT  $FE,$82,"MAX. SICAKLIK"
    LCDOUT $FE,$C6,DEC2 MAXTAMISI,0,"C"
    IF ARTTIR=0 THEN
       MAXTAMISI=MAXTAMISI+1
      PAUSE 500
    ENDIF

   IF AZALT=0 THEN
      MAXTAMISI=MAXTAMISI-1
     PAUSE 500
   ENDIF
   IF MAXTAMISI>50 THEN MAXTAMISI=50


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

  GOTO MAXSICAYAR
AYARCIKIS:
     LCDOUT  $FE,$82,"KAYDEDILDI"
      PAUSE 2000
WRITE 1,MAXTAMISI
PAUSE 10
WRITE 2,MAXNEM
PAUSE 10
     LCDOUT $FE,1
     pause 200
     GOTO BASLA
     
   
     
      EKRAN:
      LCDOUT  $FE,$80,"ISI:",DEC2 TAMISI,"/NEM:",DEC2 TAMRUT,"/SET:",DEC2 MAXTAMISI
      LCDOUT  $FE,$C0,"NS1:",DEC1 NS1,"/NS2:",DEC1 NS2,"/NS3:",DEC1 NS3
      LCDOUT  $FE,$94,"NS4:",DEC1 NS4,"/NS5:",DEC1 NS5,"/NS6:",DEC1 NS6
      LCDOUT $FE,$D4,"MTR:",DEC1 MTR,"/V1:",DEC1 VALF1,"/V2:",DEC1 VALF2,"/FN:",DEC1 FAN
      RETURN
      END


üstü çizik olanlara bir bak istersen. gosubla gidip goto ile başa dönmüşün stac taşması yapabilir.

Pardon ete hocam aynı konuyu daha önce belirtmiş.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

#6
Az evvel baktım ama iç bir normallik göremedim. Lüzumsuz Pauseler programın doğru çalışmasını yada en azından görsel güzelliği zorluyor. Bu nedenle bazı değişiklikler yaptım. İlişiktedir.
Bu arada donma meselesi muhtemelen kullandığın simulasyon versiyonundan kaynaklanıyordur.
Ete


anlhlc

Şuan herhangi bir sıkıntı yok gibi duruyor.
Herkese teşekkürler,iyi çalışmalar...

Powered by EzPortal