Ultrasonik mesafe ölçer düzeltme

Başlatan Erkan Gench, 04 Mayıs 2005, 04:18:16

Erkan Gench

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
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

msag

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

Erkan Gench

Merhaba bunu duyduğuma çok sevindim. O zaman bundan sonra devreyi yapacak arkadaşlar gönül rahatlığı ile yapabilir. Tekrar teşekkürler.
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

teroman

hocam program için çok sağol ama biz devreyi bulamıyoruz sitede devreyi buraya tekrar verirsen sevinirim.

Erkan Gench

http://picproje.com/main/ adresine tıklayın ve sayfanın en altına bakın. Kolay gelsin.
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.


tsonur29

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:

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.

Dagci-85

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?

Ziya

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ı).
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

m_yilmaz001

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

selvi

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.
Yaşam anlamlandırıldıkça kutsaldır....

sünger bob

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?

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)

aslan_korhan

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...
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.