Seri İletişim ve TMR0 Kesmesi Sorunu

Başlatan erdemefe, 29 Ekim 2012, 18:36:26

erdemefe

Arkadaşlar 2 adet F628 kullanarak -50 ile 99.9 derece arasında çalışan kablosuz bir termometre projesi yaptım devre simulasyonda da gerçekte de çalışıyor fakat geliştirmeye çalıştıkça sorunlar çıkıyor. Devrede 5 tane 74hc575 ile 5 tane display sürdüm vericide DS18B20 kullandım seri iletişimide USART ile hallettim. Şimdi devreye 2. bir kablolu sensör eklemek istiyorum 5 sn kablosuz sensör 5 sn kablolu sensörden gelen bilgiyi ekrana yazması için ilk olarak saniye palslerini yakalamak için TMR0 kesmesi kullanmak istedim fakat benim hesapladığım 1 saniye hem gerçekte hem simulasyonda 7 saniyeye denk geliyor hesabım ise şu şekilde 1/64 TMR0 için bölme oranı 1uS*64*255=16,32mS yapıyor 1000mS/16,32mS=61 yapıyor her 61 kesmede snyi 1 artırıyorum fakat gerçekte de simulasyonda da 7-8 saniye sürüyor. 2. bir sorun da HSERIN 2000,ERROR,[WAIT ("EFE"),ISI.LOWBYTE,ISI.HIGHBYTE,ISARETB] komutu ile alakalı, sıcaklık bilgisi 2 SN boyunca ERROR etiketine gitsin istiyorum (ERROR etiketinde ekrana error yazacak) simulasyonda aynen oluyor fakat gerçekte vericinin beslemesini kestiğimde en son ne bilgi gelmişse orada çakılıp kalıyor hatta vericiyi çalıştırmadan alıcıyı açtığımda displaylerde hiçbirşey yazmıyor

http://www.mediafire.com/?681jwrdl8xq7dkc

'****************************************************************
'*  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   :                                                   *
'*          :                                                   *
'****************************************************************
'@ DEVICE PIC16F628A                      'işlemci 16F628                                
'@ DEVICE PIC16F628A, WDT_ON              'Watch Dog timer açık
'@ DEVICE PIC16F628A, PWRT_ON             'Power on timer açık
'@ DEVICE PIC16F628A, PROTECT_OFF         'Kod Protek kapalı
'@ DEVICE PIC16F628A, MCLR_OFF            'MCLR pini kullanılMIYOR.
'@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-------------------------------------------------------------------------------
DEFINE OSC 4                ' OSILATOR 4Mhz
DEFINE HSER_BAUD 2400       ' 2400 BAUD
INCLUDE "modedefs.bas"      ' SERI ILETISIM DAHIL ET
'-------------------------------------------------------------------------------
TRISA=%00000001             ' PORTA.0 GIRIS DIGERLERI CIKIS
TRISB=%00000000             ' B PORTLARI CIKIS
CMCON=7                     ' COMPARATOR IPTAL
OPTION_REG=%10000000        ' PULLUP DIRECLERI IPTAL
INTCON=%00000000            ' KESME YOK
'-------------------------------------------------------------------------------
SYMBOL DQ=PORTA.0           ' DS18B20 PINI
'-------------------------------------------------------------------------------
ISI     VAR WORD
HAM     VAR WORD
TEMP    VAR WORD
BUSY    VAR WORD                 
ISARET  VAR HAM.BIT11
'-------------------------------------------------------------------------------
PORTA=0
PORTB=0
'-------------------------------------------------------------------------------
BASLA:

           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
    GOSUB GONDER
    GOTO BASLA 
      
HESAPLA:                 ' Ham değerden Santigrat derece hesabı
IF ISARET=1 THEN 
    TEMP=($FFFF - HAM+1)*625
    ISI = DIV32 100
    GOTO GEC
Endif
TEMP = 625 * HAM '
ISI = DIV32 100 ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
ISI=ISI/10

    RETURN
    


GONDER:
    hserout [REP$AA\5,REP$00\5,REP$FF\5]
    HSERout [("E"),("F"),("E"),ISI.LOWBYTE,ISI.HIGHBYTE,ISARET]
    HSERout [("E"),("F"),("E"),ISI.LOWBYTE,ISI.HIGHBYTE,ISARET]
    HSERout [("E"),("F"),("E"),ISI.LOWBYTE,ISI.HIGHBYTE,ISARET]
    HSERout [("E"),("F"),("E"),ISI.LOWBYTE,ISI.HIGHBYTE,ISARET]
    HSERout [("E"),("F"),("E"),ISI.LOWBYTE,ISI.HIGHBYTE,ISARET]
    RETURN
    END


'****************************************************************
'*  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   :                                                   *
'*          :                                                   *
'****************************************************************
'@ DEVICE PIC16F628A                      'işlemci 16F628                                
'@ DEVICE PIC16F628A, WDT_ON              'Watch Dog timer açık
'@ DEVICE PIC16F628A, PWRT_ON             'Power on timer açık
'@ DEVICE PIC16F628A, PROTECT_OFF         'Kod Protek kapalı
'@ DEVICE PIC16F628A, MCLR_OFF            'MCLR pini kullanılMIYOR.
'@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-------------------------------------------------------------------------------
DEFINE OSC 4                ' OSILATOR 4Mhz
DEFINE HSER_BAUD 2400       ' 2400 BAUD
INCLUDE "modedefs.bas"      ' SERI ILETISIM DAHIL ET
'-------------------------------------------------------------------------------
TRISA=%00000000             ' A PORTLARI CIKIS
TRISB=%00000010             ' PORTB.1 GİRİŞ
CMCON=7                     ' COMPARATOR IPTAL
OPTION_REG=%10000101        ' PULLUP IPTAL 1/64 BÖLME ORANI 16.32msDE BIR KESME
INTCON=%10100000            ' TMR0 KESMESI AKTIF
 '------------------------------------------------------------------------------
symbol CLK=PORTA.0          ' 74HC595 CLOCK PINI=SH-CP
'symbol CLK=PORTA.7         ' 74HC595 CLOCK PINI=SH-CP
SYMBOL LD=PORTA.1           ' 74HC595 LATCH PINI=ST-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
'-------------------------------------------------------------------------------
SAYI        VAR WORD
X           VAR BYTE
ISI         var WORD
ISARETB     VAR BIT
SAYAC       VAR WORD
FLAG        VAR BIT
SN          VAR BYTE
'-------------------------------------------------------------------------------
PORTA=0
PORTB=0
FLAG=0
TMR0=0
SAYAC=0
'-------------------------------------------------------------------------------
on interrupt goto KESME
'-------------------------------------------------------------------------------
BASLA:

HSERIN 2000,ERROR,[WAIT ("EFE"),ISI.LOWBYTE,ISI.HIGHBYTE,ISARETB]   'SICAKLIĞI VE İŞARET BİTİNİ AL

IF FLAG=0 THEN              'FLAG 0 IKEN  
ISI=ISI                     'SICAKLIK OKUNAN SICAKLIK
ELSE                        'FLAG 1 İKEN
ISI=367                     'SICAKLIK 367 (36.7 DERECE) (DENEME AMAÇLI OLARAK)
ENDIF

IF ISARETB=0 THEN           'SICAKLIK POZİTİFSE
        IF ISI>999 THEN     '99.9 DERECEDEN BÜYÜKSE 
        ISI=999             '99.9 DERECE ÇÜNKÜ 3 HANE KULLANIYORUZ
        GOTO HOT            'EKRANA HOT YAZ
        ENDIF
GOTO ARTI                   'POZİTİF SICAKLIK YAZMA ETIKETİNE GİT
ENDIF

IF ISARETB=1 THEN           'İŞARET NEGATİFSE
    IF ISI>500 THEN         '50.0 DERECEDEN BÜYÜKSE
    ISI=500                 '50.0 DERECE 
    GOTO COLD               'EKRANA COLDD YAZ
    ENDIF
GOTO EKSI                   'NEGATİF SICAKLIK YAZMA ETİKETİNE GİT
ENDIF
'-------------------------------------------------------------------------------
ARTI:
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
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
PULSOUT LD,1
GOTO BASLA
'-------------------------------------------------------------------------------
EKSI:
x=11          : gosub al : gosub yaz                    ' C ISARETI
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,1
GOTO BASLA  
'-------------------------------------------------------------------------------
HOT:
SAYI=0                   : GOSUB YAZ                    ' BOS
SAYI=0                   : GOSUB YAZ                    ' BOS
X=16          : gosub al : gosub yaz                    ' t HARFI
X=15          : gosub al : gosub yaz                    ' o HARFI
X=17          : gosub al : gosub yaz                    ' h HARFI
PULSOUT LD,1
GOTO BASLA
'-------------------------------------------------------------------------------
COLD:
SAYI=0                   : GOSUB YAZ                    ' BOS
X=18          : gosub al : gosub yaz                    ' d HARFI
X=19          : gosub al : gosub yaz                    ' l HARFI
X=15          : gosub al : gosub yaz                    ' o HARFI
X=20          : gosub al : gosub yaz                    ' c HARFI
PULSOUT LD,1
GOTO BASLA
'-------------------------------------------------------------------------------
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,1
GOTO BASLA
'-------------------------------------------------------------------------------
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] : RETURN       '74HC595LERE VERIYI YAZ
'-------------------------------------------------------------------------------

DISABLE                     'KESME İÇİNDE KESME OLUŞMASIN
KESME:
SAYAC=SAYAC+1               'SAYACI ARTIR, HER ARTMASI 16.32ms

IF SAYAC >=61 THEN          'SAYAC 61 OLDUYSA 995ms YAKLAŞIK 1SN
SAYAC=0                     'SAYACI SIFIRLA
SN=SN+1                     'SANİYEYİ 1 ARTIR
    IF SN=5 THEN            'SANİYE 5 OLDUYSA
    SN=0                    'SANIYEYİ SIFIRLA
    TOGGLE FLAG             'FLAG 1 DEN 0 0DAN 1 OLSUN
    ENDIF
ENDIF
    
INTCON.2=0                  'TMR0 FLAGİ SIFIRLA
RESUME                      'GELDİĞİN YERE GİT
ENABLE                      'KESMELER AKTIF
'-------------------------------------------------------------------------------
END