DIY Speedo Healer (electronics knowledge required)

Where all the workshop knowledge lives together.
henryhoover
Posts: 5
Joined: Sat Dec 04, 2010 6:03 pm

Re: DIY Speedo Healer (electronics knowledge required)

Post by henryhoover »

Hi,
This thread is very interesting & the efforts of Phil have to be applauded :thumbup:

I'm after building a speedo corrector for 2 reasons, I need to convert the speedo from km/h to mph as the bike is an import with no option to change the display from km/h.
It would also be very handy to be able to adjust the speedo if different size sprockets were used as the bike is a trail bike.

I noticed that the device was tested on a Yamaha R6, my bike is a Yamaha so I assume it would work on it ok.

I would be very grateful for the Hex code for the PIC chip.


Cheers.
User avatar
benny hedges
Posts: 6110
Joined: Sun Oct 18, 2009 5:09 pm
Location: Warrington

Re: DIY Speedo Healer (electronics knowledge required)

Post by benny hedges »

is it an analogue speedo????
if so you can get overlay stickers off ebay to convert kph to mph.
if it's a digital one there might be a method of changing the display like there is on the sp

where is phil btw, anyone seen him around..... got a little job for him :shh:
You do not have to say anything. But it may harm your defence if you do not mention when posting something which you later rely on in quote. Anything you do say may be ripped to sh*t.
henryhoover
Posts: 5
Joined: Sat Dec 04, 2010 6:03 pm

Re: DIY Speedo Healer (electronics knowledge required)

Post by henryhoover »

Hi,
No, unfortunately it's a full digital speedo or I would have just used an overlay like you suggest :thumbup:

There is no way to change it to mph by button presses or anything like that, the km/h symbol is etched into the glass of the speedo.


Cheers.
User avatar
Phil-VTwin
Posts: 348
Joined: Mon May 11, 2009 11:21 am
Location: Olney, Bucks

Re: DIY Speedo Healer (electronics knowledge required)

Post by Phil-VTwin »

I'm still here :wink:

Henry i ignored your PM as you had not posted on the forum but as you have now here is the .hex file code.....

Code: Select all

:020000040000FA
:0200000069286D
:080008000528F000030EF100D1
:10001000831203138B183928831203130C19192820
:100020008C18582883120313710E8300F00E700E83
:1000300009000C11831203133518202805162128F6
:100040000512B509321C28283108AF003008AE006F
:100050001608AB001508AA002B082F07AD002A08C8
:100060002E07AC000318AD0A2D0896002C08950049
:1000700008288B100F08A5000E08A4000F08250201
:10008000031946280F08A5000E08A400331C5028A9
:1000900023082502A70022082402A600031CA703A8
:1000A0002508A3002408A200B401910164000828D7
:1000B0008C1083120313B40A341D0828831603130B
:1000C0000C11831203130B12970110101211051655
:1000D0001228831603130F178F160F168312031798
:1000E000103085008316031301118110011083164F
:1000F00003139B01831203138501831603134030FE
:10010000850083120313860183160313FF308600D4
:10011000831603138113831203139016831603139C
:10012000A9309200831203139101B4017F30920031
:10013000831203130030970083120313B501CD011E
:10014000CC010516A420C828A001A101051F201478
:100150000608FE39A1000310A109A10C21087F3A6D
:1001600003198B2921087E3A0319A22921087D3A17
:100170000319B62921087C3A0319CA29201CC4286E
:100180002108643ECC00C7282108643CCC0008004C
:100190009101B401101075308F00A30030308E0033
:1001A000A2000C100618D228061CD4281014061819
:1001B000D728061CD9280C18C8280E08A4000F0838
:1001C000A50023082502A70022082402A600031C7C
:1001D000A7032708AF0096002608AE009500250863
:1001E000A3002408A200831203170514831203132B
:1001F0008B100C118C100B1683160313011783162A
:1002000003130C158C14831203130B178B170A306E
:100210009700A42033102708A9002608A80033144B
:10022000182132102908B1002808B0003214092919
:100230000730C000A130C1002030C2002908C3002F
:100240002808C40071214108C0004208C1004D08BF
:10025000C3004C08C40050214608C0004708C10034
:100260004808C2000030C3006430C4007121410856
:10027000C3004208C400C0010730C000A130C10063
:100280002030C20071214108A9004208A8000310D3
:10029000A90CA80C031C4F29A80A0319A90A0800D5
:1002A000C501C601C7018030C800C00CC10C031CC9
:1002B00062294408C70743080318430FC6070318F9
:1002C000C50A0310C11F6A294408C607430803185A
:1002D000430FC507C50CC60CC70CC80C031C552919
:1002E0000800C901CA011830CB00420DC10DC00D74
:1002F000CA0DC90DC20D4408CA024308031C430FAE
:10030000C9020318421442188829C9074408CA07B9
:10031000CB0B752908000530D10085179521851371
:100320009521D10B8D298513A4280830CE002F30BC
:10033000CF000330D000CE0B9E29CF0BA029D00BCD
:100340009B290800FF30D10085170516AD21051245
:10035000AD21D10BA5298513A428C230CE000230CF
:10036000CF00CE0BB429CF0BB1290800FF30D1004C
:1003700085170516C1210512C121D10BB929051216
:10038000A428C230CE000130CF00CE0BC829CF0B3D
:10039000C52908000A30D1000618CC298517061C8B
:0C03A000CF298513D10BCC298513A4288C
:02400E00502F31
:02401000FC3F73
:00000001FF
:thumbup:
Ride Safe
Phil
henryhoover
Posts: 5
Joined: Sat Dec 04, 2010 6:03 pm

Re: DIY Speedo Healer (electronics knowledge required)

Post by henryhoover »

Hi,
Phil I appreciate that, Thank you. :thumbup:

Can I ask, is the hex code for the PIC 16F88 or the 16F87 as you mentioned that either could be used?.

A couple of guys on a different forum are looking at a speedo corrector for me but it's nice to have a couple of options, If I build your device I will certainly post back to let you how I get on with it.


Cheers.
User avatar
Phil-VTwin
Posts: 348
Joined: Mon May 11, 2009 11:21 am
Location: Olney, Bucks

Re: DIY Speedo Healer (electronics knowledge required)

Post by Phil-VTwin »

I wrote it for the F88 as i already had this controller but should work ok on the F87 as the only difference is the A/D convertors which are not used.

Anyway i am feeling generous and as its Christmas here is my source code :biggrin

Code: Select all

; TMR2 is used as a way to detect when the rear wheel speed comes to a stop. 
; More precisely, when the VSS frequency drops below a certain frequency.  TMR2 is
; configured to run at a frequency that will allow it to more quickly detect this
; (more quickly than the watch dog timer, that is).  Normally, the Interrupt
; service routine (DoINT) will be clearing the watch dog timer, and the TMR2
; overflow counter.  If the rear wheel stops (thus no Interrupts from the VSS)
; then the TMR2 interrupts will be allowed to occur.  If more than three TMR2
; interrupts arrive (that's a VSS frequency of just less than about 8 Hz), 
; then the TMR2 interrupt routine will disable other interrupts
; and stop the CCP1 module, which in turn halts the output signal to the speedo. 
; Shortly there-after, the watchdog timer will expire, and the processor will
; reset, effectively re-initializing the whole routine.
;
; TMR1 is configured to run at 500KHz. The minimum frequency that can be
; supported by the CCP1 module is therefore about 8Hz.  In the
; bootstrap portion of the main loop (used to detect initial wheel rotation),
; pre-loading the TMR1 registers with 7530h allows for the maximum amount of time
; (or minimum frequency) to be detected.  In other words, the VSS frequency has to
; be at least 8Hz before control is allowed to proceed beyond the "Begin" loop,
; and into the main "Loop".

	ERRORLEVEL -302 ;remove message about using proper bank

;***** Declarations and microcontroller configuration *****
	PROCESSOR 16f88
	#include "p16f88.inc"
		__CONFIG _CONFIG1, _CP_OFF&_CCP1_RB3&_DEBUG_OFF&_WRT_PROTECT_OFF&_CPD_OFF&_LVP_OFF&_BODEN_ON&_MCLR_OFF&_PWRTE_ON&_WDT_OFF&_INTRC_IO
		__CONFIG _CONFIG2, _IESO_OFF&_FCMEN_OFF

;**********************************************************************************************************
;***** Declaration of variables *****
FAST			equ	H'20'		; fast or slow correction
SWITCH			equ	H'21'		; DIP switch reading
CAP1L			equ	H'22'		; capture 1 timer value
CAP1H			equ	H'23'
CAP2L			equ	H'24'		; capture 2 timer value
CAP2H			equ	H'25'
CAPDIFFL		equ	H'26'		; capture difference
CAPDIFFH		equ	H'27'
TEMPDIFFL		equ	H'28'		; Temp cature difference
TEMPDIFFH		equ	H'29'
OLDCOMPL		equ	H'2A'		; old compare timer
OLDCOMPH		equ	H'2B'
NEXTCOMPL		equ	H'2C'		; next compare timer
NEXTCOMPH		equ	H'2D'
COMPL			equ	H'2E'		; compare timer
COMPH			equ	H'2F'
NEWCOMPL		equ	H'30'		; new compare timer
NEWCOMPH		equ	H'31'
NEWCOMPVALID	equ	H'32'		; new compare done flag
CAPDIFFUPDOK	equ	H'33'		; capture difference done flag
TMR2OF			equ	H'34'		; Timer2 overflow flag
PORTA4			equ	H'35'		; Output port on/off flag

; Math variables
AA0				equ	H'40'		; Division dividend
AA1				equ	H'41'
AA2				equ	H'42'
BB0				equ	H'43'		; Division divisor
BB1				equ	H'44'
CC0				equ	H'45'		; 32 bit result from multiply
CC1				equ	H'46'
CC2				equ	H'47'
CC3				equ	H'48'
REMB0			equ	H'49'		; Division remainder
REMB1			equ	H'4A'
LOOPCOUNT		equ	H'4B'		; Division loopcount
CFL				equ	H'4C'		; Correction factor
CFH				equ	H'4D'
DELAY1			equ H'4E'  		; Delay/Loop registers
DELAY2			equ H'4F'
DELAY1_2		equ H'50'
d1				equ H'51'


;Save register area
W_TEMP			equ H'70'		; Used to save registers when an interrupt occurs
STATUS_TEMP		equ H'71'

;**********************************************************************************************************	
;***** Program memory structure *****
		ORG         0x00            ; Reset Vector
		goto        Init            ; After reset jump to location

		ORG         0x04            ; Interupt vector
		goto        IntSvc          ;

;**********************************************************************************************************
IntSvc
; Save W & STATUS
	movwf       W_TEMP          ;Copy W to W_TEMP register
	swapf       STATUS,W        ;Swap status to be saved into W
																;Swaps are used because they do not affect the status bits
	movwf       STATUS_TEMP     ;Save status to bank zero STATUS_TEMP register

;**********************************************************************************************************
IntDispatch
	banksel     0
	btfsc       INTCON,INTF     ; Are we handling a INT on RB0? (input)
	goto		DoINT           ; Yes

		banksel     PIR1
	btfsc       PIR1,CCP1IF     ; Are we handling a CCP1 (compare) interrupt? (output)
	goto        DoCCP1          ; Yes

	btfsc       PIR1,TMR2IF     ; Are we handling a Timer2 interrupt? (input stopped)
	goto        DoTMR2          ; Yes

;**********************************************************************************************************
IntSvcExit
; Restore W & STATUS
		banksel     0	
	swapf		STATUS_TEMP,W	; Swap STATUS_TEMP register into W
								; (sets bank to original state)
	movwf		STATUS			; Move W into STATUS register
	swapf		W_TEMP,F		; Swap W_TEMP
	swapf		W_TEMP,W		; Swap W_TEMP into W

	retfie
;**********************************************************************************************************
DoCCP1
	bcf         PIR1,CCP1IF     ; Clear the CCP1IF interrupt flag
	banksel     0
	
		btfsc       PORTA4,0		; Check if output port is on
		goto        $+3				; jump if yes
		bsf         PORTA,4			; switch on (FF)
		goto        $+2
		bcf         PORTA,4			; switch off (00)
		comf        PORTA4,F		; flip value 
		
; Calculate a new Compare timer value
; CCPR1 = COMP + CCPR1
		btfss       NEWCOMPVALID,0
		goto        $+5
		movfw       NEWCOMPH
		movwf       COMPH
		movfw       NEWCOMPL
		movwf       COMPL

		movfw       CCPR1H
		movwf       OLDCOMPH
		movfw       CCPR1L
		movwf       OLDCOMPL
		
		movfw       OLDCOMPH
		addwf       COMPH,W
		movwf       NEXTCOMPH

		movfw       OLDCOMPL
		addwf       COMPL,W
		movwf       NEXTCOMPL

		btfsc       STATUS,C	
		incf        NEXTCOMPH,F
		
		movfw       NEXTCOMPH
		movwf       CCPR1H

		movfw       NEXTCOMPL
		movwf       CCPR1L

		goto        IntDispatch

;**********************************************************************************************************
DoINT
	bcf         INTCON,INTF		; Clear the INT interrupt flag
		movfw       TMR1H
		movwf       CAP2H
		movfw       TMR1L
		movwf       CAP2L

		movfw       TMR1H
		subwf       CAP2H,W
		btfsc       STATUS,Z
		goto        $+5

		movfw       TMR1H
		movwf       CAP2H
		movfw       TMR1L
		movwf       CAP2L
	 
		btfss       CAPDIFFUPDOK,0	
		goto        MoveCAP2toCAP1	
; Calculate new capture timer diff.
; CAPDIFF = CAP2 - CAP1
		movfw       CAP1H
		subwf       CAP2H,W
		movwf       CAPDIFFH
		movfw       CAP1L
		subwf       CAP2L,W
		movwf       CAPDIFFL
		btfss       STATUS,C
		decf        CAPDIFFH,F

MoveCAP2toCAP1
	movfw       CAP2H
	movwf       CAP1H
	movfw       CAP2L
	movwf       CAP1L
	
	clrf        TMR2OF			; Clear overflow flag and timer
	clrf        TMR2
	clrwdt						; Clear WDT timer to indicate program still running

	goto        IntDispatch

;**********************************************************************************************************
DoTMR2
	bcf         PIR1,TMR2IF     ; Clear the TMR2IF interrupt flag
	banksel     0

		incf        TMR2OF,F
		btfss       TMR2OF,2        ; Have we overflowed 2 times yet?
		goto        IntDispatch     ; No
		
		banksel     PIE1			; Shutdown interrupts and let the WDT timeout restart everything
		bcf         PIE1,CCP1IE
		banksel     INTCON
		bcf         INTCON,INTE
		clrf        CCP1CON         ; Turn the CCP1 module off
		bcf         T1CON,TMR1ON    ; Turn Timer1 off
		bcf         T2CON,TMR2ON    ; Turn Timer2 off
		bsf         PORTA,4			; Turn on PORTA,4 to switch off Q2
		
		goto        IntSvcExit

;**********************************************************************************************************    
Init
; Initialize the system clock oscillator frequency
	banksel		OSCCON
	bsf 		OSCCON,IRCF2	; IRCF2:IRFC1:IRFC0 = b'111'
	bsf 		OSCCON,IRCF1	; Configure the internal clock to run at 8MHz
	bsf         OSCCON,IRCF0

; Initialize the Watch Dog Timer (WDT) period select for approx 1/4 second timeout.
; But leave the WDT disabled, we'll enable it later.
; We configure the period select configuration bits to scale this down to give us an approx
; 1/4 sec timeout.  31,250 Hz / 8192 = 3.81 Hz = 262ms
		banksel     WDTCON
		movlw       B'00010000'     ; period select = 1:8192, SWDTEN = 0 (off)
		movwf       WDTCON
		banksel     OPTION_REG
		bcf         OPTION_REG,PS2	; PS2:PS0 = 000 means prescaler 1:1
		bcf         OPTION_REG,PS1
		bcf         OPTION_REG,PS0


; Initialize A/D converter
		banksel     ANSEL
		clrf        ANSEL       	; Make all port pins digital
		
; Initialize PORTA
	banksel		PORTA
	clrf		PORTA
	banksel 	TRISA
	movlw       B'01000000'
	movwf		TRISA			; Make PORTA all output except RA6


; Initialize PORTB
	banksel		PORTB
	clrf		PORTB
	banksel		TRISB
	movlw       B'11111111'
	movwf       TRISB   		; Make PORTB all input
	banksel     OPTION_REG
	bcf			OPTION_REG,NOT_RBPU	;Enable PortB pull-ups	

; Initialize Timer1
		banksel     T1CON
		bsf         T1CON,T1CKPS1   ; Prescaler 1:4 (500Khz)
		
; Initialize Timer2
		banksel     PR2
		movlw       .169							;169
		movwf       PR2
		banksel     TMR2
		clrf        TMR2
		clrf        TMR2OF
		movlw       B'1111111'     ; Turn Timer 2 on, Postscaler 1:16, Prescaler 1:16
		movwf       T2CON


; Initialize CCP1
		banksel     CCP1CON
		movlw       B'00000000'     ; CCP1 off
		movwf       CCP1CON
		
; Initialize RAM variables
		banksel		0
		clrf        PORTA4
		clrf       	CFH
		clrf       	CFL
		bsf			PORTA,4			;Turn on PORTA,4 to switch off Q2

	call		RD_SW
	goto		Begin
;**********************************************************************************************************
RD_SW 							; Read switch settings
TstRet

	clrf		FAST
	clrf		SWITCH

	btfss		PORTA,6				; Read fast or slow setting
	bsf			FAST,0				; if low set bit0 in FAST

	movf		PORTB,W				; Read PortB	
	andlw		B'11111110'			; Strip bit 0 (RB0 not needed)

	movwf		SWITCH
	bcf 		STATUS,C
	comf		SWITCH,f
	rrf			SWITCH,f			; Rotate remaining bits to the right

PWR
	movf		SWITCH,w
	xorlw 		H'7F'				; LED test setting
	btfsc		STATUS,Z			; if equal
	goto		PWRTest

Freq
	movf		SWITCH,w
	xorlw 		H'7E'				; 440Hz Output Test
	btfsc		STATUS,Z			; if equal
	goto		FREQTest

Freq1
	movf		SWITCH,w
	xorlw 		H'7D'				; 1.02KHz Output Test
	btfsc		STATUS,Z			; if equal
	goto		FREQTest1K

Vss
	movf		SWITCH,w
	xorlw 		H'7C'				; VSS Input Test
	btfsc		STATUS,Z			; if equal
	goto		VSSTest

; Check if fast or slow switch is set
		btfss   	FAST,0 				; Is bit0 set (slower)?
		goto    	$+5					; yes
; Set correction factor to be faster		
	movf		SWITCH,W
	addlw		.100				; Add 100 to switch value
	movwf		CFL
	goto 		$+4
; Set correction factor to be slower	
	movf		SWITCH,W			; Subtract switch value from 100
	sublw		.100
	movwf		CFL

	Return
;**********************************************************************************************************
; Check to see if we're moving faster than a crawl
Begin
		clrf        TMR2
		clrf        TMR2OF
	
		bcf         T1CON,TMR1ON    ; Turn Timer1 off

		movlw       0x75						;Prefills timer registers 
		movwf       TMR1H
		movwf       CAP1H
		movlw       0x30
		movwf       TMR1L
		movwf       CAP1L
		bcf         PIR1,TMR1IF     ; Clear the Timer1 interrupt flag
		btfsc       PORTB,0         ; Wait for RB0/INT to go low
		goto        $-1
		btfss       PORTB,0         ; Wait for RB0/INT to go high
		goto        $-1
		bsf         T1CON,TMR1ON    ; Turn Timer1 on
		btfsc       PORTB,0         ; Wait for RB0/INT to go low
		goto        $-1
		btfss       PORTB,0         ; Wait for RB0/INT to go high
		goto        $-1
		btfsc       PIR1,TMR1IF     ; Did Timer1 overflow?
		goto        Begin           ; Yes, so start over
	
		movfw       TMR1L           ; Capture Timer1 value
		movwf       CAP2L
		movfw       TMR1H
		movwf       CAP2H


; Calculate first compare timer value.
; CAPDIFF = CAP2 - CAP1
		movfw       CAP1H
		subwf       CAP2H,W
		movwf       CAPDIFFH

		movfw       CAP1L
		subwf       CAP2L,W
		movwf       CAPDIFFL

		btfss       STATUS,C
		decf        CAPDIFFH,F

		movfw       CAPDIFFH
		movwf       COMPH
		movwf       CCPR1H

		movfw       CAPDIFFL
		movwf       COMPL
		movwf       CCPR1L

		movfw       CAP2H
		movwf       CAP1H

		movfw       CAP2L
		movwf       CAP1L
	 
		banksel     WDTCON
		bsf         WDTCON,SWDTEN   ; Turn the watchdog timer on
		
; Set up interrupts
		banksel     INTCON
		bcf         INTCON,INTF
		bcf         PIR1,CCP1IF
		bcf         PIR1,TMR2IF
		bsf         INTCON,INTE
		banksel     OPTION_REG
		bsf         OPTION_REG,INTEDG
		banksel     PIE1
		bsf         PIE1,CCP1IE
		bsf         PIE1,TMR2IE
		banksel     0
		bsf         INTCON,PEIE
		bsf         INTCON,GIE
		movlw       B'00001010'     ; CCP1 = Compare mode on
		movwf       CCP1CON

;**********************************************************************************************************
; Main Loop
Loop
		call		RD_SW
		bcf         CAPDIFFUPDOK,0	; Clear ok flag and copy registers
		movfw       CAPDIFFH
		movwf       TEMPDIFFH
		movfw       CAPDIFFL
		movwf       TEMPDIFFL
		bsf         CAPDIFFUPDOK,0	; Set ok flag
	
		call        CalcNewCompare

		bcf         NEWCOMPVALID,0	; Clear valid flag and copy new values
		movfw       TEMPDIFFH
		movwf       NEWCOMPH
		movfw       TEMPDIFFL
		movwf       NEWCOMPL
		bsf         NEWCOMPVALID,0	; Set valid flag

		goto        Loop

;**********************************************************************************************************
CalcNewCompare
; Calculate the percentage correction
; The latest capture diff contains the number of Timer1 ticks that occured for one cycle of
; the input frequency.
; Divide 500,000 (Timer1 is running at 500Khz) by the latest of capture diff, giving the
; frequency in Hz.

		movlw       0x07            ; 500,000 = 0x07A120
		movwf       AA0
		movlw       0xa1
		movwf       AA1
		movlw       0x20
		movwf       AA2
		movfw       TEMPDIFFH
		movwf       BB0
		movfw       TEMPDIFFL
		movwf       BB1

		call        DIV24x16		; divide prescaler freq by counted ticks during 1 cycle

		movfw       AA1
		movwf       AA0
		movfw       AA2
		movwf       AA1
		movfw       CFH
		movwf       BB0
		movfw       CFL
		movwf       BB1

		call        MUL16x16		; Multiply result by correction factor

		movfw       CC1             
		movwf       AA0
		movfw       CC2
		movwf       AA1
		movfw       CC3
		movwf       AA2
		movlw       high .100
		movwf       BB0
		movlw       low .100
		movwf       BB1

		call        DIV24x16		; Divide the result by 100

		movfw       AA1
		movwf       BB0
		movfw       AA2
		movwf       BB1
		clrf        AA0

		movlw       0x07            ; 500,000 = 0x07A120
		movwf       AA0
		movlw       0xa1
		movwf       AA1
		movlw       0x20
		movwf       AA2

		call        DIV24x16		; Answer gives the total time for 1 cycle

		movfw       AA1
		movwf       TEMPDIFFH
		movfw       AA2
		movwf       TEMPDIFFL

DIV2
; Divide by 2 to give the period for each on and off time for 1 cycle (50% duty)
		clrc
		rrf			TEMPDIFFH, f
		rrf			TEMPDIFFL, f
	
		skpc
		goto		no_inc
		incf		TEMPDIFFL, f
		skpnz
		incf		TEMPDIFFH, f
no_inc


		return

;**********************************************************************************************************      
; Unsigned 16*16 bit Multiply AA(16) * BB(16), Result (CC) is 32bit
; adapted from code found on www.piclist.com
;
; params 	
;	AA 0:1 (MSB:LSB)    = number to multiply (16bit)
;	BB 0:1 (MSB:LSB)    = multiplier (16bit)
;   CC 0:3 (MSB:LSB)	= Product (32bit)

MUL16x16
		clrf        CC0
		clrf        CC1
		clrf        CC2
		movlw       0x80
		movwf       CC3		

nextbit
	rrf         AA0,F
	rrf         AA1,F

	btfss       STATUS,C
	goto        nobit_l
	movfw       BB1
	addwf       CC2,F

	movfw       BB0
	btfsc       STATUS,C
	incfsz      BB0,W	
	addwf       CC1,F	
	btfsc       STATUS,C
	incf        CC0,F
	bcf         STATUS,C
	
nobit_l	
	btfss       AA1,7
	goto        nobit_h
	movfw       BB1
		addwf       CC1,F
	movfw       BB0
	btfsc       STATUS,C
	incfsz      BB0,W
	addwf       CC0,F	

nobit_h
		rrf         CC0,F
		rrf         CC1,F
		rrf         CC2,F
		rrf         CC3,F

	btfss       STATUS,C
		goto        nextbit

		return

;**********************************************************************************************************    
;Divide a 24 bit number by a 16 bit number, resulting in a 16 bit number
;Inputs:
;   Dividend - AA0:AA1:AA2 (0 - most significant!)
;   Divisor  - BB0:BB1
;Temporary:
;   Counter  - LOOPCOUNT
;   Remainder- REMB0:REMB1
;Output:
;   Quotient - AA0:AA1:AA2
;
DIV24x16
	clrf		REMB0
	clrf		REMB1
	movlw		.24
	movwf		LOOPCOUNT
LOOPU2416
	rlf 		AA2,W           ;shift dividend left to move next bit to remainder
	rlf 		AA1,F
	rlf 		AA0,F

	rlf 		REMB1,F         ;shift carry (next dividend bit) into remainder
	rlf 		REMB0,F

	rlf 		AA2,F           ;finish shifting the dividend and save  carry in AA2.0,
																;since remainder can be 17 bit long in some cases
																;(e.g. 0x800000/0xFFFF). This bit will also serve
																;as the next result bit.
				 
	movf		BB1,W           ;substract divisor from 16-bit remainder
	subwf		REMB1,F
	movf		BB0,W
	btfss		STATUS,C
	incfsz		BB0,W
	subwf		REMB0,F
;here we also need to take into account the 17th bit of remainder, which
;is in AA2.0. If we don't have a borrow after subtracting from lower
;16 bits of remainder, then there is no borrow regardless of 17th bit 
;value. But, if we have the borrow, then that will depend on 17th bit 
;value. If it is 1, then no final borrow will occur. If it is 0, borrow
;will occur. These values match the borrow flag polarity.
	skpnc                       ;if no borrow after 16 bit subtraction
	bsf 		AA2,0           ;then there is no borrow in result. Overwrite
																;AA2.0 with 1 to indicate no borrow.
																;if borrow did occur, AA2.0 already
																;holds the final borrow value (0-borrow,
																;1-no borrow)

	btfsc		AA2,0           ;if no borrow after 17-bit subtraction
	goto		UOK46LL         ;skip remainder restoration.

	addwf		REMB0,F         ;restore higher byte of remainder.
																;(w contains the value subtracted from it previously)
	movf		BB1,W           ;restore lower byte of remainder
	addwf		REMB1,F
UOK46LL
	decfsz		LOOPCOUNT,F     ;decrement counter
	goto		LOOPU2416       ;and repeat the loop if not zero.

		return
;**********************************************************************************************************
; As short collection of test routines to confirm installation is ok.


PWRTest							; Flashes LED to show its working
	movlw		0x5
	movwf		d1
LEDFlash					
		bsf			PORTA,7         ; turn on LED 
	call		Delay_0
	bcf       	PORTA,7         ; turn off
	call		Delay_0
	decfsz		d1,1
		goto    	LEDFlash        ; Do it again...
	bcf			PORTA,7
	goto 		TstRet

Delay_0
	movlw		0x08
	movwf		DELAY1
	movlw		0x2F
	movwf		DELAY2
	movlw		0x03
	movwf		DELAY1_2
Delay_01
	decfsz		DELAY1, f
	goto		$+2
	decfsz		DELAY2, f
	goto		$+2
	decfsz		DELAY1_2, f
	goto		Delay_01
	return


;**********************************************************************************************************
FREQTest						; Outputs ~ 400Hz test signal to speedo
	movlw		0xFF
	movwf		d1
	bsf			PORTA,7			; Turn on LED to show in test mode
FREQ400	
		bsf     	PORTA,4         ; turn on 
	call		Delay_02a
	bcf			PORTA,4
	call		Delay_02a
	decfsz		d1,1
		goto    	FREQ400        	; Do it again...
	bcf			PORTA,7
	goto 		TstRet
Delay_02a
	movlw		0xC2
	movwf		DELAY1
	movlw		0x02
	movwf		DELAY2
Delay_021a
	decfsz		DELAY1, f
	goto		$+2
	decfsz		DELAY2, f
	goto		Delay_021a
	return

;**********************************************************************************************************
FREQTest1K						; Outputs ~ 1KHz test signal to speedo
	movlw		0xFF
	movwf		d1
	bsf			PORTA,7			; Turn on LED to show in test mode 
FREQ1K
	bsf     	PORTA,4          
	call		Delay_02
	bcf			PORTA,4
	call		Delay_02
	decfsz		d1,1
		goto    	FREQ1K        	; Do it again...
	bcf			PORTA,4
	goto 		TstRet

Delay_02
	movlw		0xc2
	movwf		DELAY1
	movlw		0x01
	movwf		DELAY2
Delay_021
	decfsz		DELAY1, f
	goto		$+2
	decfsz		DELAY2, f
	goto		Delay_021
	return
;**********************************************************************************************************
;	Test mode to detect VSS is working when the wheel is rotated by hand
;   LED will flash on each detected pulse from the VSS.
VSSTest
	movlw		0x0A			; Needs 10 pulses before return to main prog
	movwf		d1
Test
	btfsc       PORTB,0         ; Wait for RB0/INT to go low
	goto        $-1
	bsf			PORTA,7			; Turn LED off
	btfss       PORTB,0         ; Wait for RB0/INT to go high
	goto        $-1
	bcf			PORTA,7			; Turn LED on
	decfsz		d1,1
	goto		Test
	bcf			PORTA,7
	goto 		TstRet

;**********************************************************************************************************
	End
;**********************************************************************************************************

Have fun with it :)
Ride Safe
Phil
henryhoover
Posts: 5
Joined: Sat Dec 04, 2010 6:03 pm

Re: DIY Speedo Healer (electronics knowledge required)

Post by henryhoover »

Hi Phil,
Thank you for the info & the source code :clap: however I haven't the foggiest idea of how to use it :oops: :D ....I may know someone who does tho.
Either way I thank you for sharing your work & helping me out, if I build a speedo corrector I'm sure it will make the bike more enjoyable to ride as no matter how much you try to ignore it when you glance down at the speedo and its reading 48 when you are in a 30 mph zone you cant help thinking you are going too fast.

With all this snow & freezing temperatures the thought of bike riding just seems a distant dream at the moment, the bike let alone any speedo project won't be going anywhere until the spring at least.


Cheers.
nunux59
Posts: 1
Joined: Thu Aug 04, 2011 9:52 am

Re: DIY Speedo Healer (electronics knowledge required)

Post by nunux59 »

Hello,

I'm interested in building this DIY but I would like to make it with an Arduino because I already have one and I'm more comfortable with it. Before starting building it I would like to clear some things.

First is the signal shape : I guess it's a square signal where the period is a multiple of the speed but I would like to know how many time the signal is high in comparison to how many time it is low.

Second is I would like to isolate the input part and the output part. I think the OUPTUT part is : R2, R5, Q2 and C1 and for the INPUT : R1, R3, R7, R8, C2, C3, Q1 and DSW1 but I am probably wrong.

Finally I wan't to remove DSW1 and will manage everything in the software, so are you using pins 7 to 13 to analyse the input signal or only 6? Should I connect the emitter of Q1 to the ground if I remove DSW1?

I will mount it on a 07' VFR and I will also try to use the Arduino for other things, for example use the thermometer as a gear position indicator.

Thank you in advance.
Pic_Maniac_16f88
Posts: 10
Joined: Mon Dec 10, 2012 10:51 pm

Re: DIY Speedo Healer (electronics knowledge required)

Post by Pic_Maniac_16f88 »

After more than 2 months with many retries, I've made a jdm programmer to program this pic 16f88 and test the code, but it seems does not worked ... I will take pictures of my converter and post here.
Pic_Maniac_16f88
Posts: 10
Joined: Mon Dec 10, 2012 10:51 pm

Re: DIY Speedo Healer (electronics knowledge required)

Post by Pic_Maniac_16f88 »

Ok, here we go ...

I ordered that willem 5.0c, but after weeks of tries decided it does not work properly, then I've made my own 16f88 pic burner as on picture:

HOW CAN I ADD THE PHOTOS OF STUFF?
Pic_Maniac_16f88
Posts: 10
Joined: Mon Dec 10, 2012 10:51 pm

Re: DIY Speedo Healer (electronics knowledge required)

Post by Pic_Maniac_16f88 »

I GOT ALL THE PICTURES, LAYOUTS ... BUT THIS FORUM DOES NOT HAS RESOURCES TO SAVE JPG?
Pic_Maniac_16f88
Posts: 10
Joined: Mon Dec 10, 2012 10:51 pm

Re: DIY Speedo Healer (electronics knowledge required)

Post by Pic_Maniac_16f88 »

Code: Select all

:100000006928FF3FFF3FFF3F0528F000030EF10086
:10001000831203138B183928831203130C19192820
:100020008C18582883120313710E8300F00E700E83
:1000300009000C11831203133518202805162128F6
:100040000512B509321C28283108AF003008AE006F
:100050001608AB001508AA002B082F07AD002A08C8
:100060002E07AC000318AD0A2D0896002C08950049
:1000700008288B100F08A5000E08A4000F08250201
:10008000031946280F08A5000E08A400331C5028A9
:1000900023082502A70022082402A600031CA703A8
:1000A0002508A3002408A200B401910164000828D7
:1000B0008C1083120313B40A341D0828831603130B
:1000C0000C11831203130B12970110101211051655
:1000D0001228831603130F178F160F168312031798
:1000E000103085008316031301118110011083164F
:1000F00003139B01831203138501831603134030FE
:10010000850083120313860183160313FF308600D4
:10011000831603138113831203139016831603139C
:10012000A9309200831203139101B4017F30920031
:10013000831203130030970083120313B501CD011E
:10014000CC010516A420C828A001A101051F201478
:100150000608FE39A1000310A109A10C21087F3A6D
:1001600003198B2921087E3A0319A22921087D3A17
:100170000319B62921087C3A0319CA29201CC4286E
:100180002108643ECC00C7282108643CCC0008004C
:100190009101B401101075308F00A30030308E0033
:1001A000A2000C100618D228061CD4281014061819
:1001B000D728061CD9280C18C8280E08A4000F0838
:1001C000A50023082502A70022082402A600031C7C
:1001D000A7032708AF0096002608AE009500250863
:1001E000A3002408A200831203170514831203132B
:1001F0008B100C118C100B1683160313011783162A
:1002000003130C158C14831203130B178B170A306E
:100210009700A42033102708A9002608A80033144B
:10022000182132102908B1002808B0003214092919
:100230000730C000A130C1002030C2002908C3002F
:100240002808C40071214108C0004208C1004D08BF
:10025000C3004C08C40050214608C0004708C10034
:100260004808C2000030C3006430C4007121410856
:10027000C3004208C400C0010730C000A130C10063
:100280002030C20071214108A9004208A8000310D3
:10029000A90CA80C031C4F29A80A0319A90A0800D5
:1002A000C501C601C7018030C800C00CC10C031CC9
:1002B00062294408C70743080318430FC6070318F9
:1002C000C50A0310C11F6A294408C607430803185A
:1002D000430FC507C50CC60CC70CC80C031C552919
:1002E0000800C901CA011830CB00420DC10DC00D74
:1002F000CA0DC90DC20D4408CA024308031C430FAE
:10030000C9020318421442188829C9074408CA07B9
:10031000CB0B752908000530D10085179521851371
:100320009521D10B8D298513A4280830CE002F30BC
:10033000CF000330D000CE0B9E29CF0BA029D00BCD
:100340009B290800FF30D10085170516AD21051245
:10035000AD21D10BA5298513A428C230CE000230CF
:10036000CF00CE0BB429CF0BB1290800FF30D1004C
:1003700085170516C1210512C121D10BB929051216
:10038000A428C230CE000130CF00CE0BC829CF0B3D
:10039000C52908000A30D1000618CC298517061C8B
:1003A000CF298513D10BCC298513A428FF3FFF3F0C
:1003B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F4D
:1003C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F3D
:1003D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F2D
:1003E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F1D
:1003F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F0D
:10040000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FFC
:10041000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FEC
:10042000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FDC
:10043000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FCC
:10044000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FBC
:10045000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FAC
:10046000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F9C
:10047000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F8C
:10048000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F7C
:10049000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F6C
:1004A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F5C
:1004B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F4C
:1004C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F3C
:1004D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F2C
:1004E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F1C
:1004F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F0C
:10050000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FFB
:10051000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FEB
:10052000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FDB
:10053000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FCB
:10054000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FBB
:10055000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FAB
:10056000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F9B
:10057000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F8B
:10058000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F7B
:10059000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F6B
:1005A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F5B
:1005B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F4B
:1005C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F3B
:1005D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F2B
:1005E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F1B
:1005F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F0B
:10060000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FFA
:10061000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FEA
:10062000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FDA
:10063000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FCA
:10064000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FBA
:10065000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FAA
:10066000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F9A
:10067000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F8A
:10068000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F7A
:10069000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F6A
:1006A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F5A
:1006B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F4A
:1006C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F3A
:1006D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F2A
:1006E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F1A
:1006F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F0A
:10070000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF9
:10071000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE9
:10072000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD9
:10073000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC9
:10074000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB9
:10075000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA9
:10076000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F99
:10077000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F89
:10078000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F79
:10079000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F69
:1007A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F59
:1007B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F49
:1007C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F39
:1007D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F29
:1007E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F19
:1007F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F09
:10080000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF8
:10081000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE8
:10082000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD8
:10083000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC8
:10084000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB8
:10085000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA8
:10086000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F98
:10087000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F88
:10088000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F78
:10089000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F68
:1008A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F58
:1008B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F48
:1008C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F38
:1008D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F28
:1008E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F18
:1008F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F08
:10090000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF7
:10091000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE7
:10092000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD7
:10093000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC7
:10094000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB7
:10095000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA7
:10096000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F97
:10097000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F87
:10098000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F77
:10099000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F67
:1009A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F57
:1009B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F47
:1009C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F37
:1009D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F27
:1009E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F17
:1009F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F07
:100A0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF6
:100A1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE6
:100A2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD6
:100A3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC6
:100A4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB6
:100A5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA6
:100A6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F96
:100A7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F86
:100A8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F76
:100A9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F66
:100AA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F56
:100AB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F46
:100AC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F36
:100AD000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F26
:100AE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F16
:100AF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F06
:100B0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF5
:100B1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE5
:100B2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD5
:100B3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC5
:100B4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB5
:100B5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA5
:100B6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F95
:100B7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F85
:100B8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F75
:100B9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F65
:100BA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F55
:100BB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F45
:100BC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F35
:100BD000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F25
:100BE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F15
:100BF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F05
:100C0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF4
:100C1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE4
:100C2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD4
:100C3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC4
:100C4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB4
:100C5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA4
:100C6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F94
:100C7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F84
:100C8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F74
:100C9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F64
:100CA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F54
:100CB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F44
:100CC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F34
:100CD000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F24
:100CE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F14
:100CF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F04
:100D0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF3
:100D1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE3
:100D2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD3
:100D3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC3
:100D4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB3
:100D5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA3
:100D6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F93
:100D7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F83
:100D8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F73
:100D9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F63
:100DA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F53
:100DB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F43
:100DC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F33
:100DD000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F23
:100DE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F13
:100DF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F03
:100E0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF2
:100E1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE2
:100E2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD2
:100E3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC2
:100E4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB2
:100E5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA2
:100E6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F92
:100E7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F82
:100E8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F72
:100E9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F62
:100EA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F52
:100EB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F42
:100EC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F32
:100ED000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F22
:100EE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F12
:100EF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F02
:100F0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF1
:100F1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE1
:100F2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD1
:100F3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC1
:100F4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB1
:100F5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA1
:100F6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F91
:100F7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F81
:100F8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F71
:100F9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F61
:100FA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F51
:100FB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F41
:100FC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F31
:100FD000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F21
:100FE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F11
:100FF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F01
:10100000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF0
:10101000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE0
:10102000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD0
:10103000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC0
:10104000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB0
:10105000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA0
:10106000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F90
:10107000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F80
:10108000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F70
:10109000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F60
:1010A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F50
:1010B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F40
:1010C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F30
:1010D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F20
:1010E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F10
:1010F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F00
:10110000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FEF
:10111000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FDF
:10112000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FCF
:10113000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FBF
:10114000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FAF
:10115000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F9F
:10116000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F8F
:10117000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F7F
:10118000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F6F
:10119000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F5F
:1011A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F4F
:1011B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F3F
:1011C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F2F
:1011D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F1F
:1011E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F0F
:1011F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FFF
:10120000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FEE
:10121000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FDE
:10122000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FCE
:10123000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FBE
:10124000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FAE
:10125000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F9E
:10126000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F8E
:10127000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F7E
:10128000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F6E
:10129000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F5E
:1012A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F4E
:1012B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F3E
:1012C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F2E
:1012D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F1E
:1012E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F0E
:1012F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FFE
:10130000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FED
:10131000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FDD
:10132000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FCD
:10133000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FBD
:10134000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FAD
:10135000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F9D
:10136000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F8D
:10137000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F7D
:10138000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F6D
:10139000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F5D
:1013A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F4D
:1013B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F3D
:1013C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F2D
:1013D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F1D
:1013E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F0D
:1013F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FFD
:10140000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FEC
:10141000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FDC
:10142000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FCC
:10143000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FBC
:10144000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FAC
:10145000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F9C
:10146000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F8C
:10147000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F7C
:10148000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F6C
:10149000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F5C
:1014A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F4C
:1014B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F3C
:1014C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F2C
:1014D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F1C
:1014E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F0C
:1014F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FFC
:10150000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FEB
:10151000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FDB
:10152000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FCB
:10153000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FBB
:10154000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FAB
:10155000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F9B
:10156000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F8B
:10157000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F7B
:10158000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F6B
:10159000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F5B
:1015A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F4B
:1015B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F3B
:1015C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F2B
:1015D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F1B
:1015E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F0B
:1015F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FFB
:10160000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FEA
:10161000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FDA
:10162000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FCA
:10163000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FBA
:10164000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FAA
:10165000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F9A
:10166000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F8A
:10167000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F7A
:10168000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F6A
:10169000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F5A
:1016A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F4A
:1016B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F3A
:1016C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F2A
:1016D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F1A
:1016E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F0A
:1016F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FFA
:10170000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE9
:10171000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD9
:10172000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC9
:10173000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB9
:10174000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA9
:10175000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F99
:10176000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F89
:10177000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F79
:10178000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F69
:10179000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F59
:1017A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F49
:1017B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F39
:1017C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F29
:1017D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F19
:1017E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F09
:1017F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF9
:10180000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE8
:10181000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD8
:10182000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC8
:10183000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB8
:10184000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA8
:10185000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F98
:10186000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F88
:10187000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F78
:10188000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F68
:10189000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F58
:1018A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F48
:1018B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F38
:1018C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F28
:1018D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F18
:1018E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F08
:1018F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF8
:10190000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE7
:10191000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD7
:10192000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC7
:10193000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB7
:10194000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA7
:10195000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F97
:10196000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F87
:10197000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F77
:10198000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F67
:10199000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F57
:1019A000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F47
:1019B000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F37
:1019C000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F27
:1019D000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F17
:1019E000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F07
:1019F000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF7
:101A0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE6
:101A1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD6
:101A2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC6
:101A3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB6
:101A4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA6
:101A5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F96
:101A6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F86
:101A7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F76
:101A8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F66
:101A9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F56
:101AA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F46
:101AB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F36
:101AC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F26
:101AD000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F16
:101AE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F06
:101AF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF6
:101B0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE5
:101B1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD5
:101B2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC5
:101B3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB5
:101B4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA5
:101B5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F95
:101B6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F85
:101B7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F75
:101B8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F65
:101B9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F55
:101BA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F45
:101BB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F35
:101BC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F25
:101BD000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F15
:101BE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F05
:101BF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF5
:101C0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE4
:101C1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD4
:101C2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC4
:101C3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB4
:101C4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA4
:101C5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F94
:101C6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F84
:101C7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F74
:101C8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F64
:101C9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F54
:101CA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F44
:101CB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F34
:101CC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F24
:101CD000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F14
:101CE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F04
:101CF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF4
:101D0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE3
:101D1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD3
:101D2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC3
:101D3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB3
:101D4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA3
:101D5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F93
:101D6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F83
:101D7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F73
:101D8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F63
:101D9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F53
:101DA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F43
:101DB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F33
:101DC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F23
:101DD000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F13
:101DE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F03
:101DF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF3
:101E0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE2
:101E1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD2
:101E2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC2
:101E3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB2
:101E4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA2
:101E5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F92
:101E6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F82
:101E7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F72
:101E8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F62
:101E9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F52
:101EA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F42
:101EB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F32
:101EC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F22
:101ED000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F12
:101EE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F02
:101EF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF2
:101F0000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE1
:101F1000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD1
:101F2000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC1
:101F3000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB1
:101F4000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA1
:101F5000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F91
:101F6000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F81
:101F7000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F71
:101F8000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F61
:101F9000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F51
:101FA000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F41
:101FB000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F31
:101FC000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F21
:101FD000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F11
:101FE000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F01
:101FF000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF1
:084000000F000F000F000F007C
:02400E00502F31
:10420000FF00FF00FF00FF00FF00FF00FF00FF00B6
:10421000FF00FF00FF00FF00FF00FF00FF00FF00A6
:10422000FF00FF00FF00FF00FF00FF00FF00FF0096
:10423000FF00FF00FF00FF00FF00FF00FF00FF0086
:10424000FF00FF00FF00FF00FF00FF00FF00FF0076
:10425000FF00FF00FF00FF00FF00FF00FF00FF0066
:10426000FF00FF00FF00FF00FF00FF00FF00FF0056
:10427000FF00FF00FF00FF00FF00FF00FF00FF0046
:10428000FF00FF00FF00FF00FF00FF00FF00FF0036
:10429000FF00FF00FF00FF00FF00FF00FF00FF0026
:1042A000FF00FF00FF00FF00FF00FF00FF00FF0016
:1042B000FF00FF00FF00FF00FF00FF00FF00FF0006
:1042C000FF00FF00FF00FF00FF00FF00FF00FF00F6
:1042D000FF00FF00FF00FF00FF00FF00FF00FF00E6
:1042E000FF00FF00FF00FF00FF00FF00FF00FF00D6
:1042F000FF00FF00FF00FF00FF00FF00FF00FF00C6
:10430000FF00FF00FF00FF00FF00FF00FF00FF00B5
:10431000FF00FF00FF00FF00FF00FF00FF00FF00A5
:10432000FF00FF00FF00FF00FF00FF00FF00FF0095
:10433000FF00FF00FF00FF00FF00FF00FF00FF0085
:10434000FF00FF00FF00FF00FF00FF00FF00FF0075
:10435000FF00FF00FF00FF00FF00FF00FF00FF0065
:10436000FF00FF00FF00FF00FF00FF00FF00FF0055
:10437000FF00FF00FF00FF00FF00FF00FF00FF0045
:10438000FF00FF00FF00FF00FF00FF00FF00FF0035
:10439000FF00FF00FF00FF00FF00FF00FF00FF0025
:1043A000FF00FF00FF00FF00FF00FF00FF00FF0015
:1043B000FF00FF00FF00FF00FF00FF00FF00FF0005
:1043C000FF00FF00FF00FF00FF00FF00FF00FF00F5
:1043D000FF00FF00FF00FF00FF00FF00FF00FF00E5
:1043E000FF00FF00FF00FF00FF00FF00FF00FF00D5
:1043F000FF00FF00FF00FF00FF00FF00FF00FF00C5
:00000001FF
Pic_Maniac_16f88
Posts: 10
Joined: Mon Dec 10, 2012 10:51 pm

Re: DIY Speedo Healer (electronics knowledge required)

Post by Pic_Maniac_16f88 »

I can load the hex into pic, erase it and program all successful, but when I try to read what is writen inside the chip is shows me the code posted up ... and the microcontroller does not work when I put on my pcb, I would like to add photos, but this forum does not allow it.
User avatar
Wicky
Posts: 7895
Joined: Sat Feb 11, 2006 2:43 pm
Location: Colchester Essex
Contact:

Re: DIY Speedo Healer (electronics knowledge required)

Post by Wicky »

It may be that your whole purpose in life is simply to serve as a warning to others.

ImageVTR Firestorm and other bikes t-shirts
Pic_Maniac_16f88
Posts: 10
Joined: Mon Dec 10, 2012 10:51 pm

Re: DIY Speedo Healer (electronics knowledge required)

Post by Pic_Maniac_16f88 »

http://www.electronicecircuits.com/circ ... amming-pic

THIS SITE SHOW HOW TO SETUP THE ICPROG
Post Reply