When counts cross 65535, number will be 00000 and counts again upto 65535
but when i code
if W0 < 0 then W0 = 65535 + 1
after this counter will 00000 and hang on 00001
.
When counts cross 65535, number will be 00000 and counts again upto 65535
but when i code
if W0 < 0 then W0 = 65535 + 1
after this counter will 00000 and hang on 00001
.
That's my point...
W0 cannot be less than 'ZERO' with PBP...
PBP does not natively handle negative numbers using normal math routines. Yes there are a few commands that can handle signed integers, but not in the way you're looking to handle them. There are no 'minus' signs
You must figure out your own method to handle those negative numbers.
precision,
Give this a try.
The range will be +/-32767.Code:DEFINE OSC 20 INCLUDE "MODEDEFS.BAS" INCLUDE "MYLCD.BAS" ANSEL = 0 'SELECT ANALOG INPUTS 0 = NONE AND ALL DIGITAL ADCON0 = 0 'AD MODULE OFF & CONSUMES NO CURRENT CMCON = 7 'COMPARATORS OFF TRISA = %00000 TRISB = %00000011 ' INT0 = ENCODER CH. A ' PORTB.1 = ENCODER CH. B W0 VAR WORD LastW0 VAR WORD B1 var word W0 = 0 B1 = 0 PAUSE 500 '------------------------------------------------------------------------- INCLUDE "DT_INTS-14.bas" ; Base Interrupt System INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler INT_INT, _ToggleLED1, PBP, yes endm INT_CREATE ; Creates the interrupt processor ENDASM OPTION_REG.6 = 0 ; 1 = Interrupt on rising edge of INT pin ; 0 = Interrupt on falling edge of INT pin @ INT_ENABLE INT_INT ; enable external (INT) interrupts '------------------------------------------------------------------------- LCDOUT $FE,1 LOOP: IF W0 <> LastW0 then LastW0 = W0 ' (Peak-Hold), Hold the last value of W0 in B1 if ABS(LastW0) > ABS(B1) then B1 = LastW0 LCDOUT $FE,2 LCDOUT "Length = ", Sdec LastW0, " mm " lcdout $FE, $C0 lcdout "Peak- Value ",Sdec B1, " mm " ENDIF GOTO LOOP ToggleLED1: if PORTB.1 = 0 then W0 = W0+1 else w0 = w0-1 ENDIF @ INT_RETURN
Added: Modified slightly to eliminate changes while displaying.
Modified again to simplify. ABS() works for both pos and neg numbers. Doh!
It also fixes a problem if it moves slightly negative before going positive.
I'll get it right one of these times
<br>
Last edited by Darrel Taylor; - 12th July 2007 at 03:24. Reason: Modified
DT
Just posting this for an email notification that I changed the program above.
In case you're already trying it.
<br>
DT
You might want to just try the whole program I posted, instead of making the changes to yours. Because I think you've missed something.
With the SDEC modifier in the lcdout statements, it will read -1, -2, -3 etc. And will never show 65535.
There are several other subtle changes too.
<DT>
DT
Thanks it is work on lcd.
but on 7 seg. LED display , it is not work in +/- ,
this is my code
Code:; CHIP 18F4550 DEFINE OSC 20 INCLUDE "MODEDEFS.BAS" CMCON = 7 ADCON1 = 15 CVRCON = %00000000 'CVref turned off TRISE = %000 TRISA = 11111 TRISB = %11111111 TRISC = %11111111 TRISD = %11111111 Symbol HC_latch = PORTE.2 symbol HC_Data = PORTE.1 SYMBOL HC_Clk = PORTE.0 B1 VAR BYTE B2 VAR BYTE B3 VAR BYTE B4 VAR BYTE B5 VAR BYTE B6 VAR WORD W0 VAR WORD w3 var word DUMMY VAR WORD DIGIT1 VAR BYTE DIGIT2 VAR BYTE DIGIT3 VAR BYTE DIGIT4 VAR BYTE DIGIT5 VAR BYTE DIGIT6 VAR BYTE W1 VAR WORD MASK VAR WORD LastW0 VAR WORD B1 = 0 B2 = 0 B3 = 0 B4 = 0 B5 = 0 W1 = 0 W0 = 0 w3 = 0 E1 VAR BYTE E2 VAR BYTE E3 VAR BYTE E4 VAR BYTE E5 VAR BYTE PAUSE 500 '------------------------------------------------------------------------- INCLUDE "DT_INTS-18.bas" ; Base Interrupt System INCLUDE "ReEnterPBP-18.bas" ; Include if using PBP interrupts ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler INT0_INT, _ToggleLED1, PBP, yes endm INT_CREATE ; Creates the interrupt processor ENDASM @ INT_ENABLE INT0_INT ; enable external (INT) interrupts@ INT_ENABLE INT1_INT ; enable external (INT) interrupts '------------------------------------------------------------------------- LOOP: IF W0 <> LastW0 then LastW0 = W0 if ABS(LastW0) > ABS(w3) then w3 = LastW0 B1 = LastW0 DIG 0 B2 = LastW0 DIG 1 B3 = LastW0 DIG 2 B4 = LastW0 DIG 3 B5 = LastW0 DIG 4 '------------------------------------------ DIGIT1 = B1 LOOKUP DIGIT1,[$C0,$F9,$A4,$B0,$99,$92,$82,$F8,$80,$90],MASK E1 = MASK '------------------------------------------ DIGIT2 = B2 LOOKUP DIGIT2,[$C0,$F9,$A4,$B0,$99,$92,$82,$F8,$80,$90],MASK E2 = MASK '------------------------------------------- DIGIT3 = B3 LOOKUP DIGIT3,[$C0,$F9,$A4,$B0,$99,$92,$82,$F8,$80,$90],MASK E3 = MASK '---------------------------------------- DIGIT4 = B4 LOOKUP DIGIT4,[$C0,$F9,$A4,$B0,$99,$92,$82,$F8,$80,$90],MASK E4 = MASK '--------------------------------------- DIGIT5 = B5 LOOKUP DIGIT5,[$C0,$F9,$A4,$B0,$99,$92,$82,$F8,$80,$90],MASK E5 = MASK '--------------------------------------- HC_Latch=0 shiftout HC_data, HC_Clk, MSBFIRST,[E1,E2,E3,E4,E5,$C0] pauseus 1 HC_Latch=1 '--------------------------------------- endif GOTO LOOP ToggleLED1: if PORTB.1 = 0 THEN W0 = W0 + 1 ELSE W0 = W0 - 1 ENDIF @ INT_RETURN
Bookmarks