PULSIN komutundan nasıl çıkılır?

Başlatan OG, 31 Ocak 2007, 08:39:08

OG

PULSIN komutu verdikten sonra herhangi bir puls gelmezse program burada takılıyor, böyle bir durumda komuttan çıkma imkanı varmıdır?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

OG

Çaresi varmış;
DEFINE PULSIN_MAX 1000 'Maximum counts allowed before pulsin times out
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

OG

İlgilenen Arkadaşlara,

PULSIN komutu süre taşması olduğu zaman sağlıklı çalışmıyor (yalnızca isis de denedim). Süre taşınca kesme üretir gibi programın başına dönüyor. Çözüm bulmak için 2 gündür uğraşırken aşağıdaki kodları buldum. Gayet sağlıklı çalışıyor. TMR1 ile çalışılıyor. 16 bit değere sahip. Eğer taşma var ise alacağınız sonuç hatalı olacaktır. Bunu PIR1.0 değerinden anlayabiliyoruz ve taşma olduğunu ikaz ediyoruz.

Yararlandığım Kodlar burada (PBP).

Denediğim PROTON+ kodları:
   Device    = 16F628A
    REMINDERS = FALSE
    Config      INTRC_OSC_NOCLKOUT,_ ' Internal Oscillator
                WDT_ON,_             ' Enable watch dog timer
                PWRTE_ON,_           ' Enable power up timer
                MCLRE_OFF,_           ' Enable MCLR pin
                BODEN_ON,_           ' Enable brown out detect
                LVP_OFF,_            ' Disable Low voltage programming mode   
                CP_OFF               ' Disable code protect
    REMINDERS = TRUE
    WATCHDOG  = On

PORTA=0:portb=0
TRISB=%11110000   
TRISA=%10000111   '
'-----------------------------------------------------------------
                             

'-----------------------------------------------------------------
Declare LCD_TYPE 0 ' Alpha-Type
Declare LCD_DTPIN PORTB.4 ' 4 lower Pins are used 
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.1 
Declare LCD_RWPIN PORTB.2 
Declare LCD_INTERFACE 4
Declare LCD_LINES 2

DECLARE OSC 4
'-------------------------------------------------------------------------

OPTION_REG=%00000000   
INTCON=%00000000  
T1CON = 0 
CMCON=7    
'----------------------------------------------------------------------------

dim sayi_1 as byte

'---------------------

dim T1ON AS T1CON.0	  	
dim tasma as PIR1.0		' 
dim PULSEhigh as word
dim PULSElow as word 
dim tasma_high as bit
dim tasma_low as bit

'---------------------

CLEAR
GOSUB ClearTimer
tasma_high=0
tasma_low=0
'------------------


GOTO deneme


'------------------
ClearTimer:
    TMR1L=0
    TMR1H=0
	tasma=0
    RETURN


'-----------------------------------------------------------------------

deneme:

    '
    '    Waiting for falling edge
    '    ========================
         '  
         WHILE PORTA.0=0 : WEND
         WHILE PORTA.0=1 : WEND
    '
    '    Measure low pulse
    '    =================
         '    
         T1ON=1                     ' start Timer
         WHILE PORTA.0=0 : WEND ' wait for next rising edge
         T1ON=0                     ' stop timer
         PULSElow.HIGHBYTE=TMR1H    ' store results 
         PULSElow.LOWBYTE=TMR1L     ' 
'         pulselow=pulselow / 20      ' 1 tick = 0.2 Usec @ 20MHZ OR 1 tick = 1 Usec @ 4MHZ
                                    ' Divide by 5 to have 1 uSec OR Divide by 20 to have 1 uSec
                                    ' Resolution
		if tasma=1 then
		tasma_high=1
		else
		tasma_high=0
		endif
		
         gosub Cleartimer           ' reset Timer1 register (TMR1L, TMR1H)
    '
    '    Waiting for rising edge
    '    =======================
         '
         while PORTA.0=1 : Wend
         while PORTA.0=0 : wend
    '
    '    Measure high pulse
    '    ==================
         '    
         T1ON=1                     ' Start timer
         WHILE PORTA.0=1 : WEND ' wait for next falling edge
         T1ON=0                     ' Stop Timer
         PULSEhigh.HIGHBYTE=TMR1H   ' Store result
         PULSEhigh.LOWBYTE=TMR1L    '
'         pulsehigh=pulsehigh / 20    ' match results to 1 uSec resolution
		if tasma=1 then
		tasma_low=1
		else
		tasma_low=0
		endif
gosub Cleartimer           ' reset Timer1 register (TMR1L, TMR1H)
         
cls
if tasma_low=0 then
PRINT AT 1,1, #PULSElow, " us"
else
PRINT AT 1,1, "LOW TASTI"
ENDIF

if tasma_high=0 then
PRINT AT 2,1, #PULSEhigh," us"
else
PRINT AT 2,1, "HIGH TASTI"
ENDIF
pause 1000

goto deneme

end


ISIS DOSYASI

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

alieren

eline saglik OG. cevaplar icin sagol, cok faydasi oldu. ama soruna cevap verecek kadar bilmedigim icin uzuldum.
saygilar