Seri İletişim ve TMR0 Kesmesi Sorunu

Başlatan erdemefe, 29 Ekim 2012, 02:42:03

Mucit23

Erdem buradaki devreye  bak
http://arectron.com/microchip/pic16f88-ve-ds18b20-ile-sicaklik-kontrol-devresi.html
Ben burda dediklerini yapmışım.

Ben sayının pozitif veya negatif durumunu belirleyen 15. bit ile oynamamıştım. Ayrı bir değişkende bu bilgiyi tutuyordum. Belki fikir verebilir.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

erdemefe

#31
hocam HAM2'nin 15. bitine AYAR_ISR dedikten sonra aşağıdaki kodlarla sorunu çözdüm
TERMO_AYAR:
WHILE MODE=0 : WEND

IF ARTIR=0 THEN
HAM2=HAM2+1
IF HAM2=901 THEN HAM2=900           'EN YÜKSEK 90.0 DERECE
ENDIF

IF EKSIL=0 THEN
HAM2=HAM2-1
IF HAM2=65135 THEN HAM2=65136       'EN DÜŞÜK -40 DERECE
ENDIF

IF AYAR_ISR=0 THEN
AYAR=HAM2
ELSE
AYAR=$FFFF-HAM2+1
ENDIF


X= AYAR DIG 0 : GOSUB AL : GOSUB YAZ                    'SET DEĞERİNİN VİRGÜLDEN SONRASI
X= AYAR DIG 1 : GOSUB AL : SAYI.BIT7=1 : GOSUB YAZ      'SET DEĞERİNİN BİRLER BASAMAĞI
X= AYAR DIG 2 : GOSUB AL : GOSUB YAZ                    'SET DEĞERİNİN ONLAR BASAMAĞI
IF AYAR_ISR=1 THEN
SAYI=64
ELSE
SAYI=0
ENDIF                           'SICAKLIK NEGATİFSE - YAZ DEĞİLSE BOŞ BIRAK
GOSUB YAZ
SAYI=119 : GOSUB YAZ            '4. DIJITE A YAZ
PULSOUT LD,2

FOR I=0 TO 1000
PAUSEUS 5
NEXT I

WRITE 2,HAM2.LOWBYTE
WRITE 3,HAM2.HIGHBYTE

SN=0
SAYAC=0
TMR0=0
IF MODE=0 THEN BASLA
GOTO TERMO_AYAR


Şimdi şöyle birşey yapmak istiyorum görüldüğü gibi sayı her 5ms de bir artıyor bu ince ayar yaparken virgülden sonraki basamağı ayarlarken sorun olacaktır. mesela butona 2sn'den kısa süre basarsam sayı 1'er 1'er artsın 2sn'den uzun basarsam bu hızda artsın bunu nasıl sağlayabilirim?


Ferhat hocam bu devrenizi biliyorum ellerinize sağlık bende tam size bu devrede şu hassasiyet olayını nasıl yaptığınızı soracaktım kra baktım ama pek birşey anlayamadım mantık olarak açıklarsanız kendi devreme uyarlayabilirim sanırım. Benim kodlarım bu şekilde tampon yok tabiki seninki gibi

KONTROL:
IF AYAR_ISR=0 AND ISARETB=0 THEN    'SET DEĞERİ VE ÖLÇÜLEN SICAKLIK POZİTİFKEN
    IF ISIB<AYAR THEN
    HIGH LED                        'ÖLÇÜLEN SETTEN KÜÇÜKSE LEDİ YAK
    ELSE
    LOW LED
    ENDIF
ENDIF

IF AYAR_ISR=1 AND ISARETB=1 THEN    'SET DEĞERİ VE ÖLÇÜLEN SICAKLIK NEGATİFKEN
    IF ISIB>AYAR THEN
    HIGH LED                        'ÖLÇÜLEN SETTEN KÜÇÜKSE LEDİ YAK
    ELSE
    LOW LED
    ENDIF
ENDIF

IF AYAR_ISR=0 AND ISARETB=1 THEN    'SET DEĞERİ POZİTİF ÖLÇÜLEN NEGATİFSE
HIGH LED                            'LEDİ YAK
ENDIF

IF AYAR_ISR=1 AND ISARETB=0 THEN    'SET DEĞERİ NEGATİF ÖLÇÜLEN POZİTİFSE
LOW LED                             'LEDİ SÖNDÜR
ENDIF

Mucit23

#32
Erdem Benim bu devrede aradığın herşey mevcut. Mesela set değeri girerken butona birkere basıp çekersen değer birer birer artar. Ama butona basıp elimizi çekmezsek yaklaşık 2 sn sonra sayı sürekli hizlı bir şekilde artar. Eğer sayı aralığı çok olsaydı bu işi bi ileri adıma taşıyıp butona 4 saniye boyunca basılırsa sayıyı onar onar arttırabilirim.

Bunlar tamamen iç içe girmiş döngülerle yapabiliyorum.

Yukarıda verdiğim projede menü kısmında yukarı butonuna basıldığında yaptığım işlemler aşağıdaki gibi

IF YUKARI=0 THEN
W=1:U=0:sny=0
  IF SIGN= "+" THEN
     TERM=TERM+1
     WHILE YUKARI=0
      SYC=SYC+1:GOSUB DELAY
        IF SYC>40 THEN
          SYC=50:TERM=TERM+1:GOSUB DELAY
        ENDIF
      GOSUB EKRAN2
      IF TERM>990 THEN TERM=990
    WEND
    SYC=0:IF TERM>999 THEN TERM=990
  ELSE
    TERM=TERM-1
    WHILE YUKARI=0
      SYC=SYC+1:GOSUB DELAY
        IF SYC>40 THEN
          FOREND=300:SYC=50
          TERM=TERM-1:GOSUB DELAY
        ENDIF
      GOSUB EKRAN2
      IF TERM=0 OR TERM>50 THEN
        TERM=0:SIGN = "+"
        GOSUB EKRAN2
        GOTO MENU
      ENDIF
    WEND
    SYC=0:FOREND=150
  ENDIF
ELSE
  W=0:FOREND=150
ENDIF


Öyle karmaşık göründüğüne bakma, Hem ısıtma hemde soğutma kontrolü yaptığı için biraz fazla işlem yapmam gerekiyor. Ama şimdiki kafamla yazsam. Çok daha kısa kodlarla daha iyi çalışacak şekilde yazardım.

Aslında yukarıdaki kodların özü budur.

IF YUKARI=0 THEN
     TERM=TERM+1
     WHILE YUKARI=0
      SYC=SYC+1:GOSUB DELAY
        IF SYC>40 THEN
          SYC=50:TERM=TERM+1:GOSUB DELAY
        ENDIF
      GOSUB EKRAN2
      IF TERM>990 THEN TERM=990
    WEND
    SYC=0:IF TERM>999 THEN TERM=990
ENDIF



Yukarıdaki işlemde butona 1 defa basınca sayıyı 1 arrtırıyor. Basılmaya devam edilirse belli bir süre sonra hızlı hızlı armaya başlıyor.

Hassasiyet dediğimiz şey aslında histerisiz ayarıdır. Ete hocamız iyi bilir ne işe yaradığını. Örnekle açıklayayım,
Diyelim histeris ayarı olmayan bir termometrede sıcaklığı 27.5 derece ayarlamış olalım. Eğerki Termostat ortam sıcaklığı yükseltmek adına çalışıyorsa Sıcaklık 27.5 derecenin altına iner inmez çıkışı yani ısıtıcıyı devreye alır. Sıcaklık tekrar 27.5 olur olmaz devreden çıkarır. Bu durum eğer çıkışta röle vs kullanıyorsanız röle kontaklarının çabucak eriyip iş görmez hale gelmesine sebeb olabilir. Heleki ortam sıcaklığı çabuk değişiyorsa(ki Aslında bu tür ortamlarda bu tür kontroller kullanılmaz) röle daha çabuk bozulur.

Histeris ayarıyla ortam sıcaklığına bi anlamda belli bir tolerans verilir. Yani sen sıcaklığı 27.5 dereceye ayarladıysan sıcaklık 27.4 derece olduğu zaman kontrolcü ısıtıcıyı hemen devreye almaz. Bizim verdiğimiz histeris değer kadar da tolerans sağlayıp öyle devreye alır.

Yani Sen sıcaklığı 27.5 dereceye, Histeris değerini de 0,5 yaparsan Sıcaklık 27.4 de değilde 27.0 derece olduğunda ısıtıcı devreye alınır.

Bu ON-OFF kontrolde olması gereken bir özelliktir. 
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

erdemefe

2. kodu galiba anladım Ferhat. Butona basıldığı sürece başka bir sayac artırılıyor eğer o sayaç 40dan büyükse term değişkeni delay etiketindeki sürede bir artıyor büyük değilse şart sağlanmadığı için zaten 1 artmış oluyor peki 40dan büyükse 50 yapmanın mantığı nedir orayı pek anlayamadım birde delay dediğin gecikme ne kadar?

Mucit23

Sayac 40 dan büyük olduğu için 50 ye sabitlemişim artmaya devam etmemesi için. 50 şart değil 40dan büyük bir rakam olabilir.

delay içeriği burda

DELAY: 'gecıkme
  FOR I=0 TO FOREND:NEXT
RETURN


Döngü uzunluğunu yine ben belirliyorum.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

erdemefe

Ben bunu yine beceremedim niye beceremediğimi bulmaya çalışırken set değerini ayarladığım döngüde beklemeyi kaldırdığımda gördümkü butona basılı tutsam bile set değeri farklı bir şekilde ilerliyor birşeylerden etkileniyor halbuki bu etikete gelindiğinde tüm kesmeleri kapatıyorum yardımcı olabilirmisiniz Set değerini ayarladığım döngü TERMO_AYAR döngüsü
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : ERDEM EFE                                         *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 10/29/2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
'-------------------------------------------------------------------------------
@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
'-------------------------------------------------------------------------------
DEFINE OSC 4                ' OSILATOR 4Mhz
DEFINE HSER_BAUD 2400       ' 2400 BAUD
DEFINE HSER_RCSTA 90h
DEFINE HSER_CLROERR 1
INCLUDE "modedefs.bas"      ' SERI ILETISIM DAHIL ET
'-------------------------------------------------------------------------------
TRISA=%00111100             ' A PORTLARI CIKIS
TRISB=%00000010             ' PORTB.1 GİRİŞ
CMCON=7                     ' COMPARATOR IPTAL
OPTION_REG=%10000111        ' PULLUP IPTAL 1/256 BÖLME ORANI
INTCON=%11100000            ' TMR0 KESMESI AKTIF ÇEVRESEL KESMELER AKTİF
'------------------------------------------------------------------------------
symbol CLK=PORTA.7          ' 74HC595 CLOCK PINI=SH-CP
SYMBOL LD=PORTA.6           ' 74HC595 LATCH PINI=ST-CP
SYMBOL DT=PORTB.7           ' 74HC595 DATA PINI=DS
SYMBOL DQ=PORTA.2           ' DS18B20 DATA PINI
SYMBOL MODE=PORTA.5         ' AYAR BUTONU
SYMBOL ARTIR=PORTA.4        ' ARTIR BUTONU
SYMBOL EKSIL=PORTA.3        ' AZALT BUTONU
SYMBOL LED=PORTB.4          ' RÖLE

SYMBOL RCIE =PIE1.5         ' USART ENABLE
SYMBOL RCIF =PIR1.5         ' USART FLAG
SYMBOL T0IF=INTCON.2        ' TMR0 FLAG BIT
on INTERRUPT GOTO KESME
'-------------------------------------------------------------------------------
SAYI        VAR WORD
ISI         VAR WORD
ISIA        VAR WORD
ISIB        var WORD
HAM         VAR WORD
SAYAC       VAR WORD
BUSY        VAR WORD
TEMP        VAR WORD
AYAR        VAR WORD $35
HAM2        VAR WORD $28
TERMOISI    VAR WORD

I           VAR BYTE
X           VAR BYTE
SN          VAR BYTE $30
SNA         VAR BYTE $31
SNB         VAR BYTE $32

FLAG        VAR BIT
FLAG2       VAR BIT
ISARET      VAR BIT
ISARETA     VAR HAM.BIT11
ISARETB     VAR BIT
AYAR_ISR    VAR HAM2.BIT15
TERMO_ISR   VAR BIT
'-------------------------------------------------------------------------------
PORTA=0
PORTB=0
clear
RCIE=1
'-------------------------------------------------------------------------------
READ 0,SNA
IF SNA=255 THEN SNA=10
READ 1,SNB
IF SNB=255 THEN SNB=5
READ 2,HAM2.LOWBYTE
READ 3,HAM2.HIGHBYTE

x=12 : gosub al
gosub yaz
gosub yaz
gosub yaz
gosub yaz
gosub yaz
pulsout ld,2

for i=0 to 100
pauseus 5
next i
IF MODE=0 THEN ayar1
'-------------------------------------------------------------------------------
BASLA:
WHILE MODE=0 : wend
RCIE=1
INTCON.7=1

GOSUB SENSOROKU
PAUSEUS 5

IF FLAG=0 then
  IF SN=SNA then
      TOGGLE FLAG
      SN=0
  ENDIF
ELSE
    IF SN=SNB THEN
       TOGGLE FLAG
       SN=0
    ENDIF
ENDIF
PAUSEUS 5

GOSUB SENSOR_SEC
GOSUB KONTROL

IF ISARET=0 THEN
GOSUB ARTI
ELSE
GOSUB EKSI
ENDIF


IF MODE=0 THEN TERMO_AYAR

GOTO BASLA
'-------------------------------------------------------------------------------
SENSOR_SEC:                 'FLAG 0 İSE KABLOLU 1 İSE KABLOSUZ
IF FLAG=0 THEN              'FLAG 0 IKEN 
ISI=ISIa                    'SICAKLIK KABLOLU SICAKLIK
ISARET=ISARETa              'ISARET KABLOLU ISARET
ELSE                        'FLAG 1 İKEN
ISI=ISIb                    'KABLOSUZ SICAKLIK
ISARET=ISARETb              'KABLOSUZ ISARET
ENDIF
RETURN
'-------------------------------------------------------------------------------
KONTROL:
IF AYAR_ISR=0 AND ISARETB=0 THEN    'SET DEĞERİ VE ÖLÇÜLEN SICAKLIK POZİTİFKEN
    IF ISIB<AYAR THEN
    HIGH LED                        'ÖLÇÜLEN SETTEN KÜÇÜKSE LEDİ YAK
    ELSE
    LOW LED
    ENDIF
ENDIF

IF AYAR_ISR=1 AND ISARETB=1 THEN    'SET DEĞERİ VE ÖLÇÜLEN SICAKLIK NEGATİFKEN
    IF ISIB>AYAR THEN
    HIGH LED                        'ÖLÇÜLEN SETTEN KÜÇÜKSE LEDİ YAK
    ELSE
    LOW LED
    ENDIF
ENDIF

IF AYAR_ISR=0 AND ISARETB=1 THEN    'SET DEĞERİ POZİTİF ÖLÇÜLEN NEGATİFSE
HIGH LED                            'LEDİ YAK
ENDIF

IF AYAR_ISR=1 AND ISARETB=0 THEN    'SET DEĞERİ NEGATİF ÖLÇÜLEN POZİTİFSE
LOW LED                             'LEDİ SÖNDÜR
ENDIF
RETURN
'-------------------------------------------------------------------------------
ARTI:
IF ISI>1250 THEN ISI=1250   
x=11          : gosub al                                'C İŞARETİNİ AL
IF FLAG=1 THEN                                          'FLAG 1 IKEN
SAYI.BIT7=1                                             'NOKTAYI YAK
ENDIF                                                   ' C ISARETI(FLAG 1 IKEN C HARFININ NOKTASI YANSIN)
gosub yaz                                               
x=10          : gosub al : gosub yaz                    ' DERECE ISARETI
IF ISI<1000 THEN
x=ISI dig 0   : gosub al : GOSUB YAZ                    ' ISI VIRGULDEN SONRASI
x=ISI dig 1   : gosub al : SAYI.BIT7=1: GOSUB YAZ       ' NOKTA
IF ISI>99 THEN                                           
x=ISI dig 2   
gosub al : GOSUB YAZ
ELSE
SAYI=0 : gosub yaz
ENDIF                                                    ' SICAKLIK 9.9 DERECEN KÜÇÜKSE 1. DISPLAY SÖNSÜN
ELSE
X=ISI DIG 1 : GOSUB AL : gOSUB YAZ
X=ISI DIG 2 : GOSUB AL : gOSUB YAZ
X=ISI DIG 3 : GOSUB AL : gOSUB YAZ
ENDIF
PULSOUT LD,2
RETURN
'-------------------------------------------------------------------------------
EKSI:   
x=11          : gosub al                                'C İŞARETİNİ AL
IF FLAG=1 THEN                                          'FLAG 1 IKEN
SAYI.BIT7=1                                             'NOKTAYI YAK
ENDIF                                                   ' C ISARETI(FLAG 1 IKEN C HARFININ NOKTASI YANSIN)
gosub yaz 
x=10          : gosub al : gosub yaz                    ' DERECE ISARETI
IF ISI<100 THEN                                         ' ISI 100DEN KÜÇÜKSE (10.0'DAN)
x=ISI dig 0   : gosub al : GOSUB YAZ                    ' ISI VIRGULDEN SONRASI
x=ISI dig 1   : gosub al : SAYI.BIT7=1: GOSUB YAZ       'NOKTA ve ISININ TAM KISMI
ENDIF
IF ISI>99 THEn                                          'ISI 99'DAN BÜYÜKSE (9.9'DAN)
x=ISI dig 1   : gosub al : GOSUB YAZ                    'BİRLER BASAMAĞI
x=ISI dig 2   : gosub al : GOSUB YAZ                    'ONLAR BASAMAGI
ENDIF
X=12          : gosub al : GOSUB YAZ                    ' - ISARETI
PULSOUT LD,2
RETURN
'-------------------------------------------------------------------------------
ERROR:
X=14          : gosub al : gosub yaz                    ' r HARFI
X=15          : gosub al : gosub yaz                    ' o HARFI
X=14          : gosub al : gosub yaz                    ' r HARFI
X=14          : gosub al : gosub yaz                    ' r HARFI
X=13          : gosub al : gosub yaz                    ' E HARFI
PULSOUT LD,2
return
'-------------------------------------------------------------------------------
AYAR1:
WHILE MODE=0 : weND
INTCON.7=0
RCIE=0

IF ARTIR=0 THEN
SNA=SNA+1
IF SNA=31 THEN
SNA=30
ENDIF
WHILE ARTIR=0 : WEND
ENDIF

IF EKSIL=0 THEN
SNA=SNA-1
IF SNA=255 THEN
SNA=0
ENDIF
WHILE EKSIL=0 : WEND
ENDIF

X=SNa DIG 0     : gosub al : gosub yaz
X=SNa DIG 1     : gosub al : gosub yaz
SAYI=0                     : GOSUB YAZ                    ' BOS
SAYI=0                     : GOSUB YAZ                    ' BOS
X=1             : GOSUB AL : GOSUB YAZ                   
PULSOUT LD,2
WRITE 0,SNA
IF MODE=0 THEN AYAR2
GOTO AYAR1
'-------------------------------------------------------------------------------
AYAR2:
WHILE MODE=0 : WEND

IF ARTIR=0 THEN
SNB=SNB+1
IF SNB=31 THEN
SNB=30
ENDIF
WHILE ARTIR=0 : WEND
ENDIF

IF EKSIL=0 THEN
SNB=SNB-1
IF SNB=255 THEN
SNB=0
ENDIF
WHILE EKSIL=0 : WEND
ENDIF

X=SNB DIG 0     : gosub al : gosub yaz
X=SNB DIG 1     : gosub al : gosub yaz
SAYI=0                     : GOSUB YAZ                    ' BOS
SAYI=0                     : GOSUB YAZ                    ' BOS
X=2             : GOSUB AL : GOSUB YAZ                       
PULSOUT LD,2
WRITE 1,SNB
IF MODE=0 THEN basla
SN=0
SAYAC=0
GOTO AYAR2
'-------------------------------------------------------------------------------
TERMO_AYAR:
INTCON.7=0
RCIE=0
WHILE MODE=0 : WEND

IF ARTIR=0 THEN
HAM2=HAM2+1
IF HAM2=901 THEN HAM2=900           'EN YÜKSEK 90.0 DERECE
ENDIF

IF EKSIL=0 THEN
HAM2=HAM2-1
IF HAM2=65135 THEN HAM2=65136       'EN DÜŞÜK -40 DERECE
ENDIF

IF AYAR_ISR=0 THEN
AYAR=HAM2
ELSE
AYAR=$FFFF-HAM2+1
ENDIF


X= AYAR DIG 0 : GOSUB AL : GOSUB YAZ                    'SET DEĞERİNİN VİRGÜLDEN SONRASI
X= AYAR DIG 1 : GOSUB AL : SAYI.BIT7=1 : GOSUB YAZ      'SET DEĞERİNİN BİRLER BASAMAĞI
X= AYAR DIG 2 : GOSUB AL : GOSUB YAZ                    'SET DEĞERİNİN ONLAR BASAMAĞI
IF AYAR_ISR=1 THEN
SAYI=64
ELSE
SAYI=0
ENDIF                           'SICAKLIK NEGATİFSE - YAZ DEĞİLSE BOŞ BIRAK
GOSUB YAZ
SAYI=119 : GOSUB YAZ            '4. DIJITE A YAZ
PULSOUT LD,2






IF MODE=0 THEN
WRITE 2,HAM2.LOWBYTE
WRITE 3,HAM2.HIGHBYTE
SN=0
SAYAC=0
TMR0=0
GOTO basla
ENDIF
GOTO TERMO_AYAR
'-------------------------------------------------------------------------------
TERMO_AYAR2:
WHILE MODE=0 : wEND

IF ARTIR=0 THEN
FLAG2=0
TERMOISI=ISIA
TERMO_ISR=ISARETA
WHILE ARTIR=0 : wEND
ENDIF

IF EKSIL=0 THEN
FLAG2=1
TERMOISI=ISIB
TERMO_ISR=ISARETB
WHILE EKSIL=0 : wEND
ENDIF

IF FLAG2=0 THEN
SAYI=6
ELSE
SAYI=91
ENDIF
GOSUB YAZ
SAYI=0
GOSUB YAZ
GOSUB YAZ
GOSUB YAZ
SAYI=119
GOSUB YAZ
PULSOUT LD,2

SN=0
SAYAC=0
TMR0=0
IF MODE=0 THEN BASLA
GOTO TERMO_AYAR2



'------------------------------------------------------------------------------- 
AL:   
LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57,64,121,80,92,120,116,94,48,88],SAYI
         '0 ,1,2 ,3 , 4 , 5 , 6 ,7, 8 , 9 ,o ,C ,- , E ,r ,o , t , h ,d ,  , c
RETURN     
'-------------------------------------------------------------------------------
YAZ:
shiftout dt,clk,1,[sayi]    '74HC595LERE VERIYI YAZ
RETURN       
'-------------------------------------------------------------------------------
SENSOROKU:
           OWOUT   DQ, 1, [$CC, $44]' ISI değerini oku
BEKLE:
           OWIN    DQ, 4, [BUSY]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   DQ, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    DQ, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
     
HESAPLA:                 ' Ham değerden Santigrat derece hesabı
IF ISARETA=1 THEN
    TEMP=($FFFF - HAM+1)*625
    ISIA = DIV32 100
    GOTO GEC
Endif
TEMP = 625 * HAM '
ISIA = DIV32 100 ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
ISIA=ISIA/10
RETURN
'-------------------------------------------------------------------------------
DISABLE
KESME:

IF RCIF=1 THEN RCI

    SAYAC=SAYAC+1
        IF SAYAC=15 THEN
        SAYAC=0
        SN=SN+1
        toggle PORTB.5
        ENDIF
T0IF=0
GOTO KESME_CIK

RCI:
HSERIN [WAIT ("EFE"),ISIB.LOWBYTE,ISIB.HIGHBYTE,ISARETB]   'SICAKLIĞI VE İŞARET BİTİ AL

TEMP=RCREG
KESME_CIK:
RESUME
ENABLE

END


http://youtu.be/19SlMjubQZo

ete

Ayar işlemlerinde buton gecikmesi vermezsen veya butonun hala basılı olup olmadığınıkontrol etmezsen program öyle hızlı çalışırki sen elini butondan çekinceye kadar o, 10-15 hatta daha fazla sayı birden sayar. Sende de bu oluyor. Hiç bir gecikme yok. Butona bastığın ana sayac +1 şeklinde ekliyor ve elini çekinceye kadar sayı değeri birden fazla artıyor.

Madem kesmeleri kaldırdın uygun bir gecikme koyki sayac değerinin artışını teker teker izeleyebilesin.

Butona bağlı değer artırma işlerinde butonun belirli bir süre basılmasını müteakip artış miktarını hızlandırmak için aşağıdaki mantığı kullanabilirsin.

EK=1
WHILE TUS=0 
SURE=SURE+1
  IF SURE=50 then EK=10
  SAYI=SAYI+EK  'sayı değeri ek kadar artırılıyor.
   IF SAYI>1000 then SAYI=1000 'limit kontrolü
  PAUSE 30  'izleme gecikmesi
  GOSUB EKRANA_VER 'artırılan sayı displaylere veriliyor
WEND
Burada while wend arasındaki komutlar tuşa basılı olduğu müddetçe çalıştırılacaklardır.
Başlangıçta EK=1 olduğundan Sayı değeri birer birer artacak ancak Sure değeri 50'yi geçince EK=10 olacağı için bu aşamadan sonra sayı 10'ar artacaktır. ELini butondan çekince sistem while döngüsünden çıkacak ve sayı artırma işlemi sona erecektir. Tabiiki limit kontrolününde aynı yerde yapılmasında yarar vardır.

Programın artık izlenmesi zor bir hale gelmiş. Bu nedenle ona bakıpta yorumda bulunmak gerçekten zor bu aşamadan sonra. Zira programın bütününe hakim olmadan kısmi sorularını cevaplama çok zor. Hakim olma işlemide enazından 1-2 saatlik zaman gerekitirir ki kimsenin buna zamanı olduğunu sanmıyorum. Kendin bile aradan bir kaç gün geçsin bak kendi programına çoğu yerini çözmezsin. Bunu neden yazmışımki dersin.

Ete

erdemefe

ama hocam ben bilerek döngüdeki gecikmeyi kaldırdım ki butona basılı olduğu sürece sayı artsın diye. fakat en son haliyle butona basılı tutsam bile sayı sürekli artmıyor videoda görüldüğü gibi sayı belli bir süre artıyor kısa bir düre duruyor  ve tekrar artmaya başlıyor halbuki ben elimi butondan kaldırmadığım sürece sürekli artması gerekmez mi?

ete

Elbette gerekmez. Sen tuş basılma kontrolü yapmamışsınki. Değer artırılıyor ekranda daha gösterilmeden yeniden artırılıyor.
Ama artırma döngü içinde değil. Benim örneğime bak ve seninki ile karşılaştır.

Ete

erdemefe

Hocam tekrardan merhaba final arasından sonra tekrar devre ile uğraşmaya başladım. Daha önce de dediğim gibi bu devre benim üniversite bitirme projem olacak bu dönem sonunda, bu devre üzerine sayfalarca tez yazacağım onun için bukadar üstüne düşüyorum. Termostat kısmı falan tama artık son halini aldı sayılır ayarları falan eeproma yazıp oradan da okuyabiliyorum. Ama açtığım konun da başlığı olan seri iletişimle birlikte TMR0 kesmesini kullanmada hala sorunum var simulasyonda hiçbir sorun yok fakat gerçek devrede 2 sorun var birincisi hesapladığım TMR0 kesmesi süresi olan 1 saniye simulasyonda aynen 1 saniye iken (RB5'e her snde toggle oluyor. RB5'e osiloskop bağlayıp cursor'lerle ölçüyorum) gerçek devrede 2 belki 3 saniye kadar. Simulasyonda osilatör ayarı 4MHZ gerçekte dahili osilatör kullanıyorum. 2. sorun ise verici bilgi yollamadığı zaman hatta beslemesi kesildiği anda alıcı kilitlenip kalıyor ekranda son ne varsa öylece kalıyor halbuki USART kesmesi kullanıyorum veri gelmemesi alıcıyı etkilememesi lazım değil mi? (bu sorun da simulasyonda yok alıcı ile verici bağlantısını kestiğimde sadece sıcaklık okumuyor haliyle diğer fonksiyonlar çalışıyor.)

Acaba

DEFINE HSER_BAUD 2400       ' 2400 BAUD
DEFINE HSER_RCSTA 90h
DEFINE HSER_CLROERR 1

tanımlamaların da mı bir hata var?

vaktiniz olduğunda ilgilenirseniz sevinirim. tüm dosyalar ekde

erdemefe

hocam yok mu bir cevabınız bu sorunla ilgili?

ete

Simulasyonda çalışıpta gerçekte çalışmayan ve üstelik seninki gibi komplike olan devrelere yapacak bir şeyim yok.
Ne yapabilirimki? uzaktan sihir yapıp devreni çalıştıramam.  Ancak devre ve program üzerinde mantık karşılaştırması yapabilirim. Bu karşılaştırma sonucunda sorun ortaya çıkmıyor ki zaten devrende simulasyonda çalışıyormuş.  Bu durumda mantık, devrenin çalışması gerektiğini söylüyor. Gerçekte bunu yapmıyorsa yaptığın devrede kusur aramaktan başka çaren yok.

Ete

erdemefe

teşekkürler hocam sorun derken donanımsal bir sorundan mı bahsediyorsunuz?

erdemefe

Hocam Tekrar merhaba projeye birkaç özellik daha ekleyince 16f628in hafızası doldu bende 16f88'e geömek istesim aynı kodları 16f88 için derlediğimde hata alıyorum hem proteusda hem gerçekte tüm segmentler yanıyor ama proteustan takip ettiğim kadarı ile kesmeler falan çalışıyor.

16F88'e geçmek için yaptığım değişiklikler

@ __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO 
DEFINE OSC 4                ' OSILATOR 4Mhz
ANSEL=0
OSCCON=%01100000
CMCON=7                     ' COMPARATOR IPTAL

bu satırlar.
Neyi eksik yapıyorum acaba datasheette incelediğimde CONFIG1 ve CONFIG2 registerlarında tüm ayarlar var ama CONFIG1 14 bıt olduğu için istediğim bilgiyi içine yükleyemedim. Sanıyorum bu sigorta ayarlaarıyla ilgili bir problemim var.

erdemefe

Hocam sorun pinlerden kaynaklanıyormuş 74HC595 in data pini RB5'e bağlıydı bu pinden sürekli 1 geliyor dolayısıyla ekrandaki tüm karakterler yanıyordu. Fakat bu pin programda sadece SYMBOL DT=PORTB.0  şeklinde geçiyor neden 1 olsun ki? baskılıdevrem hazır olduğu için bu pini değiştirmek istemiyorum LOW PORTB.5 komutunu verdiysemde o çıkış hep 1 görünüyor. Bu pinin bir özelliği falan mı var datasheete baktım ama pek bişey anlamadım

Powered by EzPortal