Picproje Elektronik Sitesi

DİJİTAL & ANALOG ELEKTRONİK => Şemalar & Diğer Elk-Elnk.Projeler => Konuyu başlatan: Erkan Gench - 04 Mayıs 2005, 04:18:16

Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: Erkan Gench - 04 Mayıs 2005, 04:18:16
Merhaba, gençler belki hatırlamaz ama uzun zaman önce Ultrasonik mesafe ölçer diye bir makale yayınlamıştım :)

Hex dosyasında problem olduğundan sanırım kimse bu güne kadar çalıştırmayı beceremedi. Problem assembly kodunun TASM isminde çok eski bir derleyici için yazılmış olmasından kaynaklanıyor. Bugün birkaç saat uğraşarak problemi çözmeye çalıştım gördümki TASM derleyicisinin ürettiği kodlar doğru kodlar değil. Ne kadar uğraştıysamda derleyiciyi yola getiremedim.

Bunun üzerine kodları mpasmda derlenecek hale getirmeye karar verdim ve sanırım bu sefer oldu. Isis te lcd de çıkması gereken yazılar çıkıyor düğmeler falan çalışıyor sanırım bi sorun yoktur. Şu anda malzemeler elinde olan ve devreyi deneyebilecek arkadaşlar bununla biraz uğraşıp bana sonuçları bildirirlerse çok memnun olurum.

Daha önce devreyi yapıpta çalıştıramayanlar haklarını helal etsinler.

Bu arada isiste lcd frekansını 1000khz yapmam gerekti yazıların çıkması için sanırım gerçekte bir sıkıntı olmayacaktır.

Kodlar aşağıda bunu mpasmwin ile hex'e çevirin. (Bilmeyenler için mpasmwin.exe, p16f84.inc ve bu assembly dosyasını aynı klasöre koyarak assembly dosyasını mpasmwin.exe üzerine sürükleyerek bırakın hex dosyası üretilecektir.)

ERRORLEVEL      -302
Processor       16F84

__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON


#DEFINE PAGE0 BCF 3,5    
#DEFINE PAGE1 BSF 3,5    

include <P16F84.INC>
Radix DEC

MISC1    EQU 0x0C             ;misc use
MISC2    EQU 0x0D             ;misc use
COUNT0   EQU 0x0E             ;counter 0
COUNT1   EQU 0x0F             ;counter 1
RECORD0  EQU 0x10             ;recording store LSB
RECORD1  EQU 0x11             ;recording store MSB
FEET1    EQU 0x12             ;feet byte 1 LSB
FEET2    EQU 0x13             ;feet byte 2 MSB
ANSA1    EQU 0x14             ;answer byte 1 LSB
ANSA2    EQU 0x15             ;answer byte 2 MSB
ANSA3    EQU 0x16             ;answer byte 3 MSB
ANSA4    EQU 0x17             ;answer byte 4 LSB
ANSA5    EQU 0x18             ;answer byte 5 MSB
ANSA6    EQU 0x19             ;answer byte 6 MSB
TOP0     EQU 0x1A             ;top of division byte 1 LSB
TOP1     EQU 0x1B             ;top of division byte 2 NSB
TOP2     EQU 0x1C             ;top of division byte 3 MSB
DIV1     EQU 0x1D             ;divider byte 1 LSB
DIV2     EQU 0x1E             ;divider byte 2 MSB
LOOPB    EQU 0x1F             ;loop counter B
STORE1   EQU 0x20             ;general store 1
STORE2   EQU 0x21             ;general store 2
LOOPA    EQU 0x22             ;loop counter A - for LCD only
RSLINE   EQU 0x23             ;bit 4 = RS line flag for LCD
CLKCNT   EQU 0x24             ;pre-counter for CLOCK
METRE0   EQU 0x25             ;metres byte 1 LSB
METRE1   EQU 0x26             ;metres byte 2 NSB
METRE2   EQU 0x27             ;metres byte 3 MSB
INCH1    EQU 0x28             ;inches byte 1 LSB
INCH2    EQU 0x29             ;inches byte 2 MSB
MASK     EQU 0x2A             ;foreground mask value (1 per metre)
ZERO     EQU 0x2B             ;zero count flag
LOOPW    EQU 0x2C             ;eeprom write counter (record counter)
LOOPR    EQU 0x2D             ;eeprom read counter (replay counter)
SAVE     EQU 0x2E             ;SAVE flag
TSTFLG   EQU 0x2F             ;test/setup flag

org 0x0004
goto START
org 0x0005

START:   clrf PORTA            
        movlw b'01000000'
        movwf PORTB
        PAGE1
        movlw b'00011100'
        movwf TRISA           ;Port A0-A1 as output, A2-A4 as input
        movlw b'11000000'
        movwf TRISB           ;Port B0-B5 as output, B6-B7 as input
        movlw b'00000101'       ;set timer ratio 1:64
        movwf OPTION_REG         ;pull-ups on (bit 7 = 0)
        PAGE0

CLRINT:  bcf INTCON,GIE        ;disable all interrupts
        btfsc INTCON,GIE      ;are all interrupts disabled?
        goto CLRINT           ;no, try again
       
CLRALL:  movlw 0x0C             ;clear registers
        movwf FSR
CLRA2:   clrf INDF
        incf FSR,F
        btfss FSR,4
        goto CLRA2
        btfss FSR,5
        goto CLRA2
        goto SETUP            

TABLCD:  ADDWF PCL,F           ;LCD initialisation table
        RETLW b'00110011'       ;initialise lcd - first byte
        RETLW b'00110011'       ;2nd byte (repeat of first)
        RETLW b'00110010'       ;set for 4-bit operation
        RETLW b'00101100'       ;set for 2 lines
        RETLW b'00000110'       ;set entry mode to increment each address
        RETLW b'00001100'       ;set display on, cursor off, blink off
        RETLW b'00000001'       ;clear display
        RETLW b'00000010'       ;return home, cursor & RAM to zero
                              ;end initialisation table

TBDEC1:  ADDWF PCL,F           ;table for decimalisation lsb
        retlw 0x0A             ;lsb of 10
        retlw 0x64             ;lsb of 100
        retlw 0xE8             ;lsb of 1000
        retlw 0x10             ;lsb of 10000

TBDEC2:  ADDWF PCL,F           ;table for decimalisation msb
        retlw 0               ;msb of 10
        retlw 0               ;msb of 100
        retlw 0x03             ;msb of 1000
        retlw 0x27             ;msb of 10000

MESSAG1: addwf PCL,F
        retlw 'E'
        retlw 'P'
        retlw 'E'
        retlw ' '
        retlw 'P'
        retlw 'I'
        retlw 'C'
        retlw ' '
        retlw 'T'
        retlw 'A'
        retlw 'P'
        retlw 'E'
        retlw ' '
        retlw 'B'
        retlw 'O'
        retlw 'X'

MESSAG2: addwf PCL,F
        retlw 'P'
        retlw 'R'
        retlw 'E'
        retlw 'S'
        retlw 'S'
        retlw ' '
        retlw 'S'
        retlw 'E'
        retlw 'N'
        retlw 'D'
        retlw ' '
        retlw 'K'
        retlw 'E'
        retlw 'Y'
        retlw ' '
        retlw ' '

SETUP:   call PAUSIT           ;delay

        clrf LOOPB            ;clr LCD set-up loop
LCDSET:  movf LOOPB,W          ;get table address
        call TABLCD           ;get set-up instruction
        call LCDLIN           ;perform it
        incf LOOPB,F          ;inc loop
        btfss LOOPB,3         ;has last LCD set-up instruction now been done?
        goto LCDSET           ;no
        call PAUSIT           ;delay

        clrf LOOPB
        call LCD1
TITLE1:  movf LOOPB,W          ;get table address
        call MESSAG1          ;get set-up instruction
        call LCDOUT           ;perform it
        incf LOOPB,F          ;inc loop
        btfss LOOPB,4
        goto TITLE1

        clrf LOOPB
        call LCD21
TITLE2:  movf LOOPB,W          ;get table address
        call MESSAG2          ;get set-up instruction
        call LCDOUT           ;perform it
        incf LOOPB,F          ;inc loop
        btfss LOOPB,4
        goto TITLE2

        btfsc PORTA,2         ;is SEND switch on RA2 pressed?
        bsf TSTFLG,0          ;yes, set TEST flag bit 0 (basic correction)
        btfsc PORTA,3         ;is STORE switch on RA3 pressed?
        call CLRPRM           ;yes, clear EEPROM distance records
        btfsc PORTA,4         ;is MASK switch on RA4 pressed?
        bsf TSTFLG,1          ;yes, set TEST flag bit 1 (mask correction)
        btfss PORTB,6         ;is RECALL switch on RB6 pressed?
        call CLRPRM           ;yes, clear full EEPROM & set default timings

SET2:    movf PORTA,W          ;wait for switches to be released
        andlw b'00011100'
        btfss STATUS,Z
        goto SET2
SET3:    btfss PORTB,6
        goto SET3

        movlw 1               ;set MASK to 1
        btfsc TSTFLG,0        ;is TEST flag bit 0 set ?
        movlw 0               ;yes, set MASK to 0
        movwf MASK
        clrf LOOPR            ;reset replay (read) counter
        movlw 61              ;get current record (write) counter val
        call PRMGET           ;from location 61
        movwf LOOPW           ;set result into record counter

;.......... END OF SETUP


INTRPT:  btfsc PORTA,2         ;is SEND switch on RA2 pressed?
        call TXIT             ;yes
        btfsc PORTA,3         ;is STORE switch on RA3 pressed?
        call STOREIT          ;yes (also serves as + key for correction)
        btfsc PORTA,4         ;is MASK switch on RA4 pressed?
        call MASKIT           ;yes
        btfss PORTB,6         ;is RECALL switch on RB6 pressed?
        call RECALL           ;yes (also serves as - key for correction)
        movf TSTFLG,F
        btfss STATUS,Z        ;are test flags set?
        call TXIT             ;yes, so keep on sending
        goto INTRPT

TXIT:    movlw 10
        movwf LOOPB           ;set transmission loop to 10
        clrf COUNT0           ;clear counters
        clrf COUNT1
        bsf PORTA,0
        bsf SAVE,0

BEAMIT:  nop                   ;send 40kHz signal
        nop                   ;command qty sets freq/mark-space
        nop
        nop
        nop
        nop
        nop
        nop
        comf PORTA,F          ;toggle push-pull RA0/RA1
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        comf PORTA,F          ;toggle push-pull RA0/RA1
        decfsz LOOPB,F
        goto BEAMIT
        clrf PORTA
        call RECEIVE
       
        movf TSTFLG,F
        btfsc STATUS,Z        ;are test flags set ?
        goto BEAM2            ;no

        call LCD8             ;yes, show TEST message
        movlw 'B'
        btfss TSTFLG,0        ;set prefix letter for BASIC or MASK
        movlw 'M'
        call LCDOUT

        movlw 'T'            
        call LCDOUT
        movlw 'E'
        call LCDOUT
        movlw 'S'
        call LCDOUT
        movlw 'T'
        call LCDOUT
        movlw ' '
        call LCDOUT
        call SHWTST
        goto BEAM3
       
BEAM2:   call LCD9
        movlw ' '
        call LCDOUT
        movlw ' '
        call LCDOUT
        movlw ' '
        call LCDOUT
        movlw 'L'
        call LCDOUT
        movlw 'I'
        call LCDOUT
        movlw 'V'
        call LCDOUT
        movlw 'E'
        call LCDOUT

BEAM3:   call PAUSIT           ;pause
        call PAUSIT
        return

RECEIVE: btfsc TSTFLG,0        ;is TSTFLG bit 0 set (basic correction)?
        goto MASK0            ;yes
        movf MASK,W
        movwf LOOPB

MASK1:   movlw 2               ;masking delays
        movwf ANSA2
        movlw 48
        movwf ANSA1

MASK2:   movlw 4
        movwf ANSA3
MASK3:   decfsz ANSA3,F
        goto MASK3

        decfsz ANSA1,F
        goto MASK2
        decfsz ANSA2,F
        goto MASK2
        decfsz LOOPB,F
        goto MASK1

MASK0:   bcf INTCON,RBIF       ;clear RB4-RB7 interrupt change flag
        bcf ZERO,0
LISTEN:  btfsc INTCON,RBIF     ;has echo been heard? (int change on RB7)
        goto SHWCNT           ;yes
        movlw 1               ;no, so inc COUNT0
        addwf COUNT0,F
        movf STATUS,W
        andlw 1
        addwf COUNT1,F        ;add Carry to COUNT1
        btfss STATUS,C        ;is there a Carry?
        goto LISTEN           ;no
        bsf ZERO,0
        goto METRES
       
SHWCNT:  movlw 30              ;add equivalent count for transmission time
        addwf COUNT0,F
        btfsc STATUS,C
        incf COUNT1,F
        btfsc TSTFLG,0        ;is TEST flag bit 0 set ?
        goto METRES           ;yes, bypass MASK addition

        movf MASK,W
        movwf LOOPB           ;now add 256 (MSB = 1) + EEPROM value (LSB)
                              ;to count for each MASK value - author's
                              ;ideal was MSB 1 & LSB 234 = 490

MASKAD:  movlw 63              ;set EEPROM address to 63 (mask val)
        call PRMGET           ;get MSB
        addwf COUNT0,F
        btfsc STATUS,C
        incf COUNT1,F
        incf COUNT1,F
        decfsz LOOPB,F
        goto MASKAD

METRES:  movf COUNT0,W
        movwf RECORD0
        movf COUNT1,W
        movwf RECORD1

        call GETMMS           ;calculate millimetres
        call LCD1             ;show metres on line 1 part 1
        movlw METRE1
;         movlw RECORD0        ;author's option for count checking
        call DECIMAL          ;decimalise metres
        movf ANSA5,W
        movwf ANSA6
        movf ANSA4,W
        movwf ANSA5
        movlw '.'
        movwf ANSA4
        movlw 6
        movwf LOOPB
        movlw ANSA6
        movwf FSR

        movf ANSA6,W
        xorlw 48
        btfss STATUS,Z
        goto SHOWMT
        movlw ' '             ;blank leading zero
        movwf ANSA6

SHOWMT:  call SHOWDEC
        movlw 'm'
        call LCDOUT
        movlw 't'
        call LCDOUT
        movlw ' '
        call LCDOUT

        call GETINS           ;calculate feet & inches
        call GETFEET
        call INVERT           ;correct for final inches
        movf TOP1,W
        bcf STATUS,C
        btfss ZERO,0          ;is ZERO set?
        addlw 12              ;no
        movwf INCH1
        movf STATUS,W
        andlw 1
        addwf TOP2,W
        movwf INCH2
        movf INCH1,W
        xorlw 12
        btfss STATUS,Z
        goto SHOWFT
        clrf INCH1
        clrf INCH2
        incfsz FEET1,F
        goto SHOWFT
        incf FEET2,F

SHOWFT:  call LCD21
        movlw FEET1
        call DECIMAL          ;decimalise feet
        movlw 3
        movwf LOOPB
        movlw ANSA3
        movwf FSR

        movf ANSA3,W
        xorlw 48
        btfss STATUS,Z
        goto SHWFT2
        movlw ' '             ;blank leading zero
        movwf ANSA3
        movf ANSA2,W
        xorlw 48
        btfss STATUS,Z
        goto SHWFT2
        movlw ' '             ;blank leading zero
        movwf ANSA2

SHWFT2:  call SHOWDEC
        movlw 'f'
        call LCDOUT
        movlw 't'
        call LCDOUT

SHOWIN:  movlw INCH1
        call DECIMAL          ;show remaining inches
        movlw 2
        movwf LOOPB
        movlw ANSA2
        movwf FSR

        movf ANSA2,W
        xorlw 48
        btfss STATUS,Z
        goto SHOWIN2
        movlw ' '             ;blank leading zero
        movwf ANSA2

SHOWIN2: call SHOWDEC
        movlw 'i'
        call LCDOUT
        movlw 'n'
        call LCDOUT
        movlw ' '
        call LCDOUT
        call SHOWSW
        return

GETMMS:  clrf METRE0           ;multiply by basic timing factor
        movf COUNT0,W         ;on author's unit a count of 618 = 1 metre
        movwf METRE1          ;1000/618 = 1.6181229
        movf COUNT1,W         ;therefore multiply count x 1.6181229
        movwf METRE2          ;256 x .618 = 158 (THUS MSB 1, LSB 158)
        movf COUNT0,W         ;LSB is held as variable factor in EEPROM
        btfsc STATUS,Z        ;with default value of 158
        goto GETCM2
        movwf LOOPB
GETCM1:  movlw 62              ;get basic timing value from EEPROM 62
        call PRMGET
        addwf METRE0,F
        movf STATUS,W
        andlw 1
        addwf METRE1,F
        movf STATUS,W
        andlw 1
        addwf METRE2,F
        decfsz LOOPB,F
        goto GETCM1

GETCM2:  movf COUNT1,W
        btfsc STATUS,Z
        return
        movwf LOOPB
GETCM3:  movlw 62              ;get basic timing value from EEPROM 62
        call PRMGET
        addwf METRE1,F
        movf STATUS,W
        andlw 1
        addwf METRE2,F
        decfsz LOOPB,F
        goto GETCM3
        return

GETINS:  movlw 25              ;divide by 25.4 for inches measurement
        movwf DIV2            ;set divider msb for 25
        movlw 102             ;set lsb for 102 (= 0.4 decimal as binary)
        movwf DIV1
        movf METRE1,W
        movwf STORE1
        movf METRE2,W
        movwf STORE2

        call DIVIDE
        movf ANSA1,W
        movwf INCH1
        movf ANSA2,W
        movwf INCH2
        return

GETFEET: movlw 12              ;divide by 12.0 for feet measurement
        movwf DIV2            ;set divider msb for 12
        movlw 0               ;set lsb for 0
        movwf DIV1
        movf INCH1,W
        movwf STORE1
        movf INCH2,W
        movwf STORE2
        call DIVIDE
        movf ANSA1,W
        movwf FEET1
        movf ANSA2,W
        movwf FEET2
        return
       
DIVIDE:  movf STORE1,W
        movwf TOP1
        movf STORE2,W
        movwf TOP2
        clrf TOP0

        clrf ANSA1
        clrf ANSA2
        movf TOP1,W           ;is TOP = zero?
        iorwf TOP2,W
        btfsc STATUS,Z
        goto DIVIDE3          ;yes
        call INVERT           ;invert TOP for adding instead of subtraction

DIVIDE2: movf DIV1,W           ;add lsb of DIV to lsb of TOP
        addwf TOP0,F
        movlw 1
        andwf STATUS,C        ;add carry flag to msb of TOP
        addwf TOP1,F
        movlw 1
        andwf STATUS,C        ;add carry flag to msb of TOP
        addwf TOP2,F
        btfsc STATUS,C        ;is there a carry?
        goto DIVIDE3          ;yes
        movf DIV2,W           ;no, add msb of DIV to msb of TOP
        addwf TOP1,F
        movlw 1
        andwf STATUS,C        ;add carry flag to msb of TOP
        addwf TOP2,F
        btfsc STATUS,C        ;is there a carry?
        goto DIVIDE3          ;yes
        incfsz ANSA1,F        ;no, inc counter lsb, is there a zero rollover?
        goto DIVIDE2          ;no
        incf ANSA2,F          ;yes, inc counter msb
        goto DIVIDE2        
DIVIDE3: return

LCD210:  movlw b'11001010'       ;misc LCD pixel addresses - not all used
        goto LCDLIN
LCD28:   movlw b'11001000'
        goto LCDLIN
LCD21:   movlw b'11000000'
        goto LCDLIN
LCD13:   movlw b'10001101'
        goto LCDLIN
LCD11:   movlw b'10001011'
        goto LCDLIN
LCD9:    movlw b'10001001'
        goto LCDLIN
LCD8:    movlw b'10001000'
        goto LCDLIN
LCD1:    movlw b'10000000'

LCDLIN:  BCF RSLINE,4          ;clear RS flag - sets LCD command/line
       
LCDOUT:  MOVWF STORE1          ;temp store data for LCD
        MOVLW 20              ;set min time between sending full bytes to LCD
        MOVWF LOOPA
DELAY:   DECFSZ LOOPA,F
        GOTO DELAY            
        CALL SENDIT           ;send MSB
        CALL SENDIT           ;send LSB
        BSF RSLINE,4          ;set RS flag (default is flag set)
        return
       
SENDIT:  SWAPF STORE1,F        ;get and send data nibble
        MOVF STORE1,W        
        ANDLW 15              
        IORWF RSLINE,W        ;OR the RS bit
        MOVWF PORTB           ;output the byte
        BSF PORTB,5           ;set E high
        BCF PORTB,5           ;set E low
        RETURN                
       
PAUSIT:  MOVLW 10              ;delay set
        MOVWF CLKCNT          
        CLRF INTCON
PAUSE:   BTFSS INTCON,2        ;has a timer time-out been detected?
        GOTO PAUSE            ;no
        BCF INTCON,2          ;yes
        DECFSZ CLKCNT,F       ;dec loop, is it zero?
        GOTO PAUSE            ;no
        RETURN                ;yes
       
DECIMAL: clrf ANSA1
        clrf ANSA2
        clrf ANSA3
        clrf ANSA4
        clrf ANSA5
        movwf FSR

        movf INDF,W           ;check for zero value
        incf FSR,F
        iorwf INDF,W
        btfsc STATUS,Z
        goto DEC4
       
        movf INDF,W           ;copy value into TOP
        movwf TOP2
        decf FSR,F
        movf INDF,W
        movwf TOP1
        movlw 4
        movwf LOOPB
        movlw ANSA5
        movwf FSR

DECA1:   clrf STORE2
        decf LOOPB,W
        call TBDEC1
        movwf MISC1
        decf LOOPB,W
        call TBDEC2
        movwf MISC2
        call ADDIT
        movwf INDF
        decf FSR,F
        decfsz LOOPB,F
        goto DECA1
        movf TOP1,W
        movwf INDF

DECA2:   addlw 6
        btfss STATUS,DC
        goto DEC4
        clrf INDF
        incf FSR,F
        incf INDF,F
        movf INDF,W
        goto DECA2

ADDIT:   call INVERT           ;invert to allow adding
ADDIT2:  incf STORE2,F
        movf MISC1,W
        addwf TOP1,F
        movlw 1
        andwf STATUS,W
        addwf MISC2,W
        addwf TOP2,F
        btfss STATUS,C
        goto ADDIT2
                             
        call INVERT           ;invert to allow adding
        movf MISC1,W          ;subtract last addition value
        addwf TOP1,F
        btfsc STATUS,C
        incf TOP2,F
        movf MISC2,W
        addwf TOP2,F
        decf STORE2,W
        return

DEC4:    movlw 48
        iorwf ANSA1,F
        iorwf ANSA2,F
        iorwf ANSA3,F
        iorwf ANSA4,F
        iorwf ANSA5,F
        return

SHOWDEC: movf INDF,W
        call LCDOUT
        decf FSR,F
        decfsz LOOPB,F
        goto SHOWDEC
        return

INVERT:  comf TOP1,F          
        incf TOP1,F
        btfsc STATUS,Z
        decf TOP2,F
        comf TOP2,F
        return

MASKIT:  incf MASK,F           ;inc MASK
        movf MASK,W
        xorlw 10              ;is it = 10?
        btfss STATUS,Z
        goto SHOWSW           ;no
        movlw 1               ;yes, reset MASK to 1
        movwf MASK

SHOWSW:  call LCD210
        movlw 'M'
        call LCDOUT
        movlw 'a'
        call LCDOUT
        movlw 's'
        call LCDOUT
        movlw 'k'
        call LCDOUT
        movf MASK,W
        btfsc STATUS,Z
        goto SW2
        movf MASK,W
        iorlw 48
        call LCDOUT
        movlw 'm'
        goto SW3
SW2:     movlw ' '
        call LCDOUT
        movlw '0'
SW3:     call LCDOUT
        call PAUSIT
        call PAUSIT
        call PAUSIT
        return

RECALL:  movf TSTFLG,F
        btfss STATUS,Z       ;are test flags set ?
        goto DECIT           ;yes so goto decrement correction routine

        bcf ZERO,0
        bcf SAVE,0
        call LCD11            ;show record count on line 1 cell 11
        bcf STATUS,C
        rrf LOOPR,W
        movwf COUNT0
        incf COUNT0,F
        clrf COUNT1
        movlw COUNT0
        call DECIMAL
        call BLANKS

        call LCD9            ;show ident on line 1 cell 9
        movlw 'S'
        call LCDOUT
        movlw 'H'
        call LCDOUT
        movlw 'O'
        call LCDOUT
        movlw 'W'
        call LCDOUT
        movlw '='
        call LCDOUT

        movf LOOPR,W
        call PRMGET
        movwf COUNT0
        incf LOOPR,F
        movf LOOPR,W
        call PRMGET
        movwf COUNT1
        incf LOOPR,F
        movf LOOPR,W
        xorlw 60              ;limit of 60 (records 1-30)
        btfss STATUS,Z
        goto RECAL2
        clrf LOOPR          
RECAL2:  movf COUNT0,W
        iorwf COUNT1,W
        btfsc STATUS,Z
        bsf ZERO,0
        call METRES
SHWCT4:  btfss PORTB,6         ;is RECALL switch on RB6 pressed?
        goto SHWCT4           ;yes
        call PAUSIT
        return

STOREIT: movf TSTFLG,F
        btfss STATUS,Z        ;are test flags set?
        goto INCIT            ;yes, so goto increment correction routine
        btfss SAVE,0          ;no, is SAVE flag set?
        return                ;no
        bcf SAVE,0
        movf RECORD0,W
        movwf STORE1
        movf LOOPW,W
        call SETPRM
        movf RECORD1,W
        movwf STORE1
        incf LOOPW,F
        movf LOOPW,W
        call SETPRM

SAVE2:   call LCD11            ;show record count on line 1 cell 11
        bcf STATUS,C
        rrf LOOPW,W
        movwf COUNT0
        incf COUNT0,F
        clrf COUNT1
        movlw COUNT0
        call DECIMAL
        call BLANKS

        call LCD9             ;show record count on line 1 cell 9
        movlw 'S'
        call LCDOUT
        movlw 'A'
        call LCDOUT
        movlw 'V'
        call LCDOUT
        movlw 'E'
        call LCDOUT
        movlw 'D'
        call LCDOUT

        incf LOOPW,F
        movf LOOPW,W
        xorlw 60              ;limit of 60 (records 1-30)
        btfss STATUS,Z
        goto SAVE3
        clrf LOOPW          

SAVE3:   movf LOOPW,W          ;store new LOOPW value in EEPROM
        movwf STORE1
        movlw 61
        call SETPRM

WAITIT:  btfsc PORTA,3         ;is STORE switch on RA3 pressed?
        goto WAITIT
        call PAUSIT
        return

CLRPRM:  clrf LOOPA            ;clear eeprom routine
        clrf STORE1
CLRPR2:  movf LOOPA,W
        call SETPRM
        incf LOOPA,F
        movf LOOPA,W          ;is count = 62 ?
        xorlw 62
        btfss STATUS,Z
        goto CLRPR2           ;no
        call LCD13
        movlw 'C'
        call LCDOUT
        movlw 'L'
        call LCDOUT
        movlw 'R'
        call LCDOUT

        btfsc PORTB,6         ;is RECALL pressed?
        goto CLRPR3           ;no
        movlw 158             ;yes, set basic timing value to 158
        movwf STORE1
        movlw 62
        call SETPRM
        movlw 234             ;set mask timing value to 234
        movwf STORE1
        movlw 63
        call SETPRM
CLRPR4:  btfss PORTB,6         ;is switch on RB6 still pressed?
        goto CLRPR4           ;yes, so wait

CLRPR3:  btfsc PORTA,3         ;is switch on RA3 still pressed?
        goto CLRPR3           ;yes, so wait
        return

BLANKS:  movlw 5
        movwf LOOPB
        movlw ANSA5
        movwf FSR

        movlw 4
        movwf LOOPA
ZERO1:   movf INDF,W           ;blank leading zeros
        xorlw 48
        btfss STATUS,Z
        goto SHWCT2
        movlw 32
        movwf INDF
        decf FSR,F
        decfsz LOOPA,F
        goto ZERO1

SHWCT2:  movlw ANSA5
        movwf FSR
        call SHOWDEC
        return

;...............

;WRITE DATA TO EEPROM ROUTINE:

                       ;This routine is entered with W holding
                       ;the eeprom byte address at which data
                       ;is to be stored. The data to be stored
                       ;is held in STORE1.
SETPRM: movwf EEADR     ;Now copy W into EEADR to set eeprom address
       PAGE1
       bsf EECON1,WREN ;enable write flag
       PAGE0
       movf STORE1,W   ;get data value from STORE1 and hold in W
       movwf EEDATA    ;copy W into eeprom data byte register

MANUAL: PAGE1           ;these next 12 lines are according to
       movlw 0x55       ;Microchip manual dictated factors
       movwf EECON2    ;they cause the action required by
       movlw 0xAA       ;by the eeprom to store the data in EEDATA
       movwf EECON2    ;at the address held by EEADR.
       bsf EECON1,WR   ;set the ``perform write'' flag

CHKWRT: btfss EECON1,4  ;wait until bit 4 of EECON1 is set
       goto CHKWRT
       bcf EECON1,WREN ;disable write
       bcf EECON1,4    ;clear bit 4 of EECON1
       PAGE0
       bcf INTCON,6    ;clear bit 6 of INTCON
       return          ;and return

;..........

;READ DATA FROM EEPROM ROUTINE:

                       ;This routine is entered with W holding
                       ;the eeprom byte address to be read.
PRMGET: movwf EEADR     ;Now copy W into EEADR to set eeprom address
       PAGE1           ;
       BSF EECON1,RD   ;enable read flag
       PAGE0
       movf EEDATA,W   ;read eeprom data now in EEDATA into W
       return          ;and return

;............

INCIT:  movlw 62        ;set EEPROM address to 62 (basic correction)
       btfsc TSTFLG,1  ;is TSTFLG bit 1 set
       movlw 63        ;yes, set EEPROM address to 63 (for mask correction)
       call PRMGET     ;get value to be incremented
       movwf STORE1
       incf STORE1,F   ;increment and restore it
       movlw 62        ;set EEPROM address to 62 (basic correction)
       btfsc TSTFLG,1  ;is TSTFLG bit 1 set
       movlw 63        ;yes, set EEPROM address to 63 (for mask correction)
       call SETPRM
       return

DECIT:  movlw 62        ;set EEPROM address to 62 (basic correction)
       btfsc TSTFLG,1  ;is TSTFLG bit 1 set
       movlw 63        ;yes, set EEPROM address to 63 (for mask correction)
       call PRMGET     ;get value to be decremented
       movwf STORE1
       decf STORE1,F   ;decrement and restore it
       movlw 62        ;set EEPROM address to 62 (basic correction)
       btfsc TSTFLG,1  ;is TSTFLG bit 1 set
       movlw 63        ;yes, set EEPROM address to 63 (for mask correction)
       call SETPRM
       return

SHWTST: call LCD13      ;show mask correction on top right
       movlw 62        ;set EEPROM address to 62 (basic correction)
       btfsc TSTFLG,1  ;is TSTFLG bit 1 set ?
       movlw 63        ;yes, set EEPROM address to 63 (for mask correction)
       call PRMGET
       movwf COUNT0
       clrf COUNT1
       movlw COUNT0
       call DECIMAL
       movlw 3
       movwf LOOPB
       movlw ANSA3
       movwf FSR
       call SHOWDEC
       return
       
      END
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: msag - 08 Mayıs 2005, 14:01:07
Ben yeni kodu hex e cevirip denedim ve 1mt ile 3.5 mt arası nerdeyse sıfır hatayla olcum yapabiliyorum ama 1 mt altında sıfırdan baska deger okunmuyo bu sorunun sebebi olarakta ultrasonic sensorlerin oldugunu tahmin ediyorum duzeltme icin teşekkürler
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: Erkan Gench - 08 Mayıs 2005, 14:16:04
Merhaba bunu duyduğuma çok sevindim. O zaman bundan sonra devreyi yapacak arkadaşlar gönül rahatlığı ile yapabilir. Tekrar teşekkürler.
Başlık: hocam ultra sonik mesafe ölçer..
Gönderen: teroman - 22 Şubat 2006, 00:31:57
hocam program için çok sağol ama biz devreyi bulamıyoruz sitede devreyi buraya tekrar verirsen sevinirim.
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: Erkan Gench - 22 Şubat 2006, 23:31:51
http://picproje.com/main/ adresine tıklayın ve sayfanın en altına bakın. Kolay gelsin.
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: kurumahmut - 23 Şubat 2006, 10:48:28
https://www.picproje.org/main/modules.php?name=News&file=article&sid=3
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: tsonur29 - 12 Mart 2006, 20:11:30
bu devreyi çalıştıran varmı o kadar uğraşmama rağmen çalıştıramadım. Verilen dosyayı hex e çevirdim ama  LCD de acayip karakterler çıkıyo acaba 16f84a kullandığım için mi ? ayrıca proteustada çalıştıramadım?
:roll:
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: Dagci-85 - 20 Aralık 2006, 09:57:43
Merhaba

Arkadaşlar birşey soracağım. Ben bu mesafeyi arttırmak istiyorum. Bunu nasıl yapabilirim. Bana denizde 120 metreye kadar ölçüm yapabilmesi lazım. Bunu daha güçlü transducerler kullanarak halledebilir miyim? Yoksa işin içine su da girdiği için farklı bir takım durumlar da oluşur mu? Program işini halledebilirim ama işin teorisinde suya girince birtakım değişimler olur mu? Beni bu konuda aydınlatırsanız sevinirim. Teşekkürler.
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: Dagci-85 - 21 Aralık 2006, 20:58:43
Alıntı yapılan: "Dagci-85"Merhaba

Arkadaşlar birşey soracağım. Ben bu mesafeyi arttırmak istiyorum. Bunu nasıl yapabilirim. Bana denizde 120 metreye kadar ölçüm yapabilmesi lazım. Bunu daha güçlü transducerler kullanarak halledebilir miyim? Yoksa işin içine su da girdiği için farklı bir takım durumlar da oluşur mu? Program işini halledebilirim ama işin teorisinde suya girince birtakım değişimler olur mu? Beni bu konuda aydınlatırsanız sevinirim. Teşekkürler.

Bu konu hakkında bilgisi olan bir arkadaş yok mu acaba?
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: Ziya - 25 Aralık 2006, 11:29:47
Cumartesi günü Practiker de 150 mt ölçebilen lazerli bir ölçü aleti gördüm. Oldukça hassas ve oldukça da kaliteli. Bosch marka. Tek bir kusurunu gördüm. Malesef okuduğu bilgiyi dışarı vermiyor. Yani herhangi bir PC'ye bağlayamıyorsunuz. Fiyatı 900 küsür YTL. Lazer pointerin düştüğü noktayı ölçüyor. Ben de su derinliğini ölçmek için arıyorum. Su üzerinde ölçüm zor olabilir ama suyun üzerine koyacağınız bir şamandıra ile aradaki mesafe ölçülerek bir düzeltme yapılabilirdi (Eğer veri çıkışı olsaydı).
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: m_yilmaz001 - 05 Mayıs 2007, 17:34:30
arkadaşlar ben kodları hex e çeviremedim.hata verdi.tam anlatılan gibi bi klasörün içine asm inc ve mpasmwin.exe yi attım ama hata verdi neden olabilir acaba
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: selvi - 13 Mayıs 2007, 10:50:42
erkan gench arkadasimizin verdigi projeyi haraket eden cisimler icin nasil yapmaliyiz.ornegin.sensorun onunde 5 tane cisim algilayacagi bir mesafede gecsin.ben 3.cu cisim, algilayacagi bir mesafede gectiginde alarm vermesini istiyorum.yada rf sistemiyle hangi cisim gectiginde alarm vermesini onceden ayarlama imkani varmi.projeye nasil eklemeler yapmak gerekiyor.
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: sünger bob - 13 Mayıs 2007, 12:49:32
Alıntı yapılan: "Ziya hocam"Cumartesi günü Practiker de 150 mt ölçebilen lazerli bir ölçü aleti gördüm. Oldukça hassas ve oldukça da kaliteli. Bosch marka. Tek bir kusurunu gördüm. Malesef okuduğu bilgiyi dışarı vermiyor. Yani herhangi bir PC'ye bağlayamıyorsunuz. Fiyatı 900 küsür YTL. Lazer pointerin düştüğü noktayı ölçüyor. Ben de su derinliğini ölçmek için arıyorum. Su üzerinde ölçüm zor olabilir ama suyun üzerine koyacağınız bir şamandıra ile aradaki mesafe ölçülerek bir düzeltme yapılabilirdi (Eğer veri çıkışı olsaydı).

Ziya Hocam balık radarları var hem daha ucuz 150-25000 YTL arası
hem her bilgiyi glcd de görebiliyorsunuz işinizi görmez mi?
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: seher - 01 Temmuz 2007, 09:59:49
erkan gench arkadasin ultrasonik sensor projesini 4Mhz calsiyor mu.cunku simulasyonda 1Mhz ve dusuk degerde lcd de gorunum gozukuyor.bu sadece simulasyona ozgu mu? yoksa devre kartina devreyi kurarsak 4mhz de  calisir mi.forumda bir arkadas devreyi calistirdigini 1-3,5 m arsinda hatasiz olcum yaptigini yazmis.acaba kullandigi kristalin degeri nedir.(1mhz mi yada  4mhz mi)
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: aslan_korhan - 01 Temmuz 2007, 10:11:01
Suda kullanılacaksa baya birşeyler değişiyor.
Transducer, Frekans, güç...
Sesin havada ve suda gideceği mesafe farklı. Yani suda daha hızlı ilerler.
Ayrıca su için 1KW gibi peak değerlere gereksinim oluyor.
Ama bu değer küçük bir BD tipii transistörle bile elde edilebiliniyor...
Başlık: Ultrasonik mesafe ölçer düzeltme
Gönderen: XX_CİHAN_XX - 01 Temmuz 2007, 13:23:08
Alıntı yapılan: "seher"erkan gench arkadasin ultrasonik sensor projesini 4Mhz calsiyor mu.cunku simulasyonda 1Mhz ve dusuk degerde lcd de gorunum gozukuyor.bu sadece simulasyona ozgu mu? yoksa devre kartina devreyi kurarsak 4mhz de  calisir mi.forumda bir arkadas devreyi calistirdigini 1-3,5 m arsinda hatasiz olcum yaptigini yazmis.acaba kullandigi kristalin degeri nedir.(1mhz mi yada  4mhz mi)
Devrenin şemasındada görüldüğü üzre çalışma frekansı 4mhz dir.
Devrenin Şeması