Address is not within lower half of memory page?
Ok, I am trying to get the digital tachometer working again but i have run into a few issues [noparse]:([/noparse] First, i keep getting the error Address 371 not within lower half of memory page. The error start when it tries to call the MEASURE_HI function. Second. I cannot add anymore variables because it says exceeds ram. Can anyone help clean this up a bit and possibly get it working [noparse]:)[/noparse]
DEVICE SX28, OSCXT2, TURBO, STACKX, OPTIONX FREQ 20_000_000 ID "M-SEG" RPM_signal PIN RC.0 INPUT TRIS_disp VAR TRIS_B display VAR RB rpm VAR WORD pWidth0 VAR WORD pWidth1 VAR WORD dividendMSW VAR WORD dividendLSW VAR WORD overflow VAR BIT doneBit VAR BIT digit1 VAR WORD currentrpm VAR WORD tmpW1 VAR WORD flags VAR Byte isrFlag VAR flags.0 INTERRUPT 100_000 LOW RA.3 digit1 = currentrpm / 100 currentrpm = __REMAINDER READ SegMap + currentrpm, display HIGH RA.3 LOW RA.2 digit1 = digit1 / 10 currentrpm = __REMAINDER READ SegMap + currentrpm, display HIGH RA.2 LOW RA.1 digit1 = digit1 / 10 currentrpm = __REMAINDER READ SegMap + currentrpm, display HIGH RA.1 RETURNINT PROGRAM Start MEASURE_LO FUNC 2 MEASURE_HI FUNC 2 delay SUB 1, 2 Start: TRIS_disp = %00000000 rpm = 1 Main: pWidth0 = MEASURE_LO pWidth1 = MEASURE_HI ' PULSIN RPM_signal, 0, pWidth0 ' PULSIN RPM_signal, 1, pWidth1 pWidth0 = pWidth0 + pWidth1 pWidth0 = pWidth0 * 2 dividendMSW = $005B dividendLSW = $8D80 rpm = 1 overflow = 0 DO doneBit = rpm.15 rpm = rpm << 1 IF overflow = 1 THEN rpm.0 = 1 dividendMSW = dividendMSW - pWidth0 ELSE IF dividendMSW >= pWidth0 THEN rpm.0 = 1 dividendMSW = dividendMSW - pWidth0 ENDIF ENDIF overflow = dividendMSW.15 dividendMSW = dividendMSW << 1 dividendMSW.0 = dividendLSW.15 dividendLSW = dividendLSW << 1 LOOP UNTIL doneBit = 1 rpm = rpm << 1 rpm.0 = overflow IF dividendMSW >= pWidth0 THEN rpm.0 = 1 ENDIF currentrpm = rpm GOTO Main SUB delay IF __PARAMCNT = 1 THEN ' byte parameter? tmpW1 = __PARAM1 ELSE tmpW1 = __WPARAM12 ENDIF pause tmpW1 ENDSUB FUNC MEASURE_HI tmpW1 = 0 ' clear measurement ASM JB RPM_Signal, $ ' wait for low JNB RPM_Signal, $ ' wait for 0 -> 1 ENDASM DO WHILE RPM_signal = 1 ' loop while high ASM CLRB isrFlag ' clear flag JNB isrFlag, $ ' wait for next ENDASM INC tmpW1 ' update timing IF tmpW1 = 0 THEN EXIT ' abort on roll-over LOOP RETURN tmpW1 ENDFUNC FUNC MEASURE_LO tmpW1 = 0 ' clear measurement ASM JNB RPM_Signal, $ ' wait for high JB RPM_Signal, $ ' wait for 1 -> 0 ENDASM DO WHILE RPM_Signal = 0 ' loop while low ASM CLRB isrFlag ' clear flag JNB isrFlag, $ ' wait for next ENDASM INC tmpW1 ' update timing IF tmpW1 = 0 THEN EXIT ' abort on roll-over LOOP RETURN tmpW1 ENDFUNC SegMap: ' segments maps DATA %00111111 ' 0 DATA %00000110 ' 1 DATA %01011011 ' 2 DATA %01001111 ' 3 DATA %01100110 ' 4 DATA %01101101 ' 5 DATA %01111101 ' 6 DATA %00000111 ' 7 DATA %01111111 ' 8 DATA %01100111 ' 9
Comments
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
When the going gets weird, the weird turn pro. -- HST
1uffakind.com/robots/povBitMapBuilder.php
1uffakind.com/robots/resistorLadder.php