;:MIMA Honda Insight Manual control system ;Date:may 20 2010 ;Code version 1.5.8 ;Copyright Mike Dabrowski /Genesis One ;This program is free software; you can redistribute it and/or modify it under ;the terms of the GNU General Public License as published by the Free Software ;Foundation; either version 2, or (at your option) any later version. ;Author Mike Dabrowski /Genesis One ;The Insight IMA operating system activates the electric assist motor when the throttle is depressed to a point where the ;Gas engine is not able to meet the load requested. The MIMA system which has several selectable modes. ; Mode 1, is the normal IMA system ; Mode 2, is PIMA, and it activates the electric drive when a sudden increase in MAP is detected, and charges ;the battery when a sudden decrease of MAP is requested. The battery charge level is monitored as well as the temperature of ;the IMA components, to keep the system in a safe operating mode. ;Operation Basic ;A joystick on the shift lever controlls the IMA electric motor to manually get assist or charging at will. ; The Insight ECM sends CMDPWR 2khz 50% duty cycle pulses to the MCM to tell it to assist(>50% duty) or charge(<50% duty cycle) ;The ECM also pulls the MAMODE 2 signal low when in the assist mode, and it is high when in the regen mode. ;The ECM replaces the 20KHZ 50% duty cycle MAMODE 1 signal with a 20KHZ 25% duty cycle signal when aggressive assist is desired. ; the QBAT, engine torque, actual torque, and the motor standby signals may also need to be monitored. ;Mode 3, is the throttle pedal based control of the IMA. A slight pressing on the accelerator will activate the electric assist ;before the gas has much chance to respond, lifting of the throttle will regen. ;Timer 0 is used for the CMDPWR software based PWM, INT0 sets cmdpwrout, when timer times out, cmdpwrout is cleared ;INT0 Is triggered by the incoming CMDPWR pulses ;Timer 1 is used for VSS measurements to determine time between VSS pulses ;INT2 is triggered by the rising edge of the VSS pulse. WHen triggered, the last pulse time is saved, and the timer is restarted to time the next pulse. ;Timer 2 is used for the MOAMOD2 PWM ;Timer 3 is used for system 1/8 sec heartbeat ;Aug 27 2005 ;fIX JOYSTICK MOTION DETECT which had two places where the center position was determined, now only one. ;Fix oscilator configuration so A-6 can work as an output. ;Add turn on for AR1 power transistor when regen >15A ;fix detection of speeds less than the cut off, including stopped so PIMA lockout works properly ;from 0 to 19 mph. ;get the jog calibrate to work. In PIMA, if the joystick is tapped in the assist direction ;the assist setpoint is reduced giving more assist. If the stick is jogged to the regen side ;the assist setpoint is raised, giving less assist. ;It the aux joystick is jogged up, the regen setpoint is raised, giving more regen ;if the aux joystick is jogged down, the regen setpoint is lowered, giving less regen. ;V1.2.1 FIX TYPO IN BTEMPH MEMORY LOCATION WAS H003, SHOULD BE H013 NOV 11 ;V 1.3 the boot up pattern has changed to indicate the new version. ;new patern is :0000000X, 000000X0,00000X00,0000X000,000X0000,00X00000,0X000000,X0000000, ; 0X000000,00X00000,000X0000,0000X000,00000X00,000000X0,0000000X. ; THE X IS THE LIT LED. Fixed the timer 3 init so it starts correctly each time ; ;1. CHANGE RAW JOYSTICK SCALING SO THAT 2 STICKS OR 1 WILL COVER FULL RANGE. ; ;The JOYSTICK max and min are clamped so they cannot exceed the 10% and 90% range. ; ;2. Added activation of AR2 (FAS)when joyswitch is pressed, when not in the cal mode or the PIMA mode. ; ;3. ADDED PROGRAMMABLE BACKGROUND CHARGING WHEN IN MODE 1.The level of background charge is adjustable ;with a left or right jog like the assist and regen setpoints in PIMA.It is set to allow 0-25A of regen will not ;allow higher background charge. ;when the stick is in the jogged position, the ammeter doubles it's sensitivity, to 5 amps per led.instead of 12A ; ;V 1.3.1 (12/7/05Chi) move remaining init code into init ;V 1.3.2 (12/7/05Chi) convert to automatic assembler variable allocation ;V 1.3.3 (12/11/05 MIKE)open up the joystick motion detect so regen side of deadband is wider, and scaled the stick to ; give a bigger swing in values so dual sticks can still reach full assist and regen. ; as interum step to full joystick calibration. ;V 1.3.4 (12/11/05 MIKE) make central command power ramp generator to handle all changes of dutycycle (lots of changes) ;V 1.3.5 (12/15/05) MAKE JOG CAL SO ASSIST AND REGEN SETPOINTS CANNOT CROSS EACH OTHER, SET AR1 ACTIVATION TO 15A, ; MAKE JOYSTICK CENTRAL SWITCH ACTIVATE AR2, CHANGE CAL MODE SO pima RAMP SPEED IS SECOND CAL FUNCTION AND JOYSTICK RAMP ; IS THE THIRD FUNCTION. ASSIST AND REGEN SETPOINTS CAN ONLY BE SET ONLY WITH JOG CAL ;V 1.3.6 (12/26/05) MAKE MIMA AND PIMA PAUSE FUNCTION WHEN SPEED GOES UNDER THE PIMA THRESHOLD OF 19 MPH, OR THE ABC UNDER 5 MPH. ;V 1.3.7 (12/28/05) DEACTIVATE ASSIST WHEN AT 0 MPH ;V 1.3.8 BRING THROTTLE AVERAGE/ DIRECTION/ AND RATE OF CHANGE CODE INTO MIMA IN PREPARATION FOR SMARTER APPROACH TO PIMA CONTROLL ; WHERE THE COMBINATION OF MAP AND THROTTLE VALUES WILL BE USED FOR BETTER CONTROL (NOT OPERATIONAL YET) ;V 1.3.9 ADD NEW CALIBRATE FUNCTION ; THIS FUNCTION ALLOWS SETTING OR CLEARING OF THE OPFLAG BITS. THIS FLAG IS STORED IN FLASH, AND IS RECOVERED ; ON BOOT UP. THE DISPLATY INDICATING PIMA/ABC RAMP IS NOW ALL THE AMBER LEDS ON FOR DISCRETE OR ALL THE RED LEDS FOR BICOLOR. ; THE CAL DISPLAY FOR JOYRAMP, IS ALL GREENLEDS ON THE DISCRETE DISPLAY, OR ALL GREEN LEDS FOR THE BICOLOR. ;THE BIT SET MODES ARE ENTERED ONE AT A TIME, AS DISCRETE STEPS IN THE CAL MODE, SO NOW THERE ARE 10 CAL STEPS.(YOU CAN GET OUT OF TH CAL MODE AT ANY TIME BY HITTING THE PIMA BUTTON AGAIN, OR MODE 1 SW 10 TIMES ; TO FINISH ALL THE MODES. ;PRESS AND HOLD THE MODE2 BUTTON, AND YOU ENTER THE CAL MODE. TAP2 OF THE MODE1 BUTTON, TO ENTER MAGFACTOR, ;TAP3 FOR PIMA/ABC RAMP SPEED, TAP4 FOR JOYRAMP SPEED, TAP 5 FOR BIT0 OR ASSIST STOPPED DISABLE. ;THE FIRST AMBERLED WILL GO ON IF THE VALUE WAS ALREADY ON, AND WILL BLINK IF THE BIT WAS OFF, SO YOU CAN SEE WHICH MODE THE SYSTEM IS USING. ; PRESS THE JOYSTICK CENTER BUTTON TO TOGGLE THE BIT ON(LED STEADY ON), OR TAP THE CENTER SW AGAIN TO TURN THE BIT OFF(BLINKING LED). ;THE BIT VALUE IS WRITTEN TO THE EEPROM EACH TAP. WHEN SATISFIED, TAP MODE 1 AGAIN, TO MOVE TO BIT2,THEN 3, THEN 4, THEN 5, THEN 6. BIT 7 IS ALWAYS OFF. ; BITS 1 THROUGH 6 ARE WORKING BUT HAVE NO EFFECT IN THE PROGRAM ;CHANGE THE MAG FACTOR CALIBRATE SO IT IS EASIER TO SET MAG 1 AND 4. ;THATS IT! GONNA RELEASE "NightRider" / MIMA OSV1.4 ;1.4.1 ADD TEST OF THE BACKGROUND CHARGE LEVEL AS READ FROM THE FLASH, TO ASSURE THAT IT IS IN RANGE. ;ADD TEST FOR RSETPOINT,ASETPOINT,MAGFACTOR,PIMA RAMP, JOYRAMP, AS THEY ARE READ FROM FLASH, AND ASSURE THAT THEY ARE IN RANGE. ;MOVE THE FLASH READ ROUTINE IN INIT TO AFTER THE FIRST PASS OF THE NIGHTRIDER ROUTINE TO ALLOW MORE STABILIZATION TIME BEFORE READING. ;1.4.2 Add cal option 2,3,4. to allow reconfiguring the joysticks axis and direction. ;1.4.3 Turn on BOR so the processor is put in reset whenever the power supply is too low. ;1.4.4 fix the joy centered routine so a 179 is placed in CMDPWR when the stick is in the center zone rather than using the actual stick value. ;1.4.5 Fix PIMA regen routine, it allowed an overflow when computing the CMDEPWR value, which would yield a bogus CMDPWR value that could set an IMA code ;1.4.6 manual brightness cal, make the XOXOOXOX pattern appear if the PIMA setpoints try to cross ;1.4.7 joy cal to configure direction and scale factors for the 4 possible quadrants. Will allow full action with minimum wasted resolution for both 1 or 2 joysticks ;removed the unused throttle code.All routines that use joystick data had to be modified to work with the new scaled range ; both axis of the joysticks are scaled to produce a guranteed range of 0-126 127 in middle 128-255 ;axis inverting, and axis swapping are configured at the same time. Remove the cal option 2,3,4. as this routine replaces it. ;1.4.8 Add joylock so any assist or regen amount can be locked in with a press of the central joystick IMA and MIMA modes ; added a separate jog setable ABC setpoint instead of the dependance on the PIMA setpoint. ; To switch jog modes the joystick is moved to the left or right jog zone, and the central swuitch ; is pressed to swap to the other seting. The second config step will change the default set mode for ABC. If the bit is clear(flashing) ;during calibration, the ABC charge level will be the default. If the config bit is set (not flashing) the ABC setpoint will be the default ;1.4.9 Add PWM of last amp led both in expanded scale and regular scale to inhance resoultion. ;1.5.0 RELEASED ON 3/14/06 ;1.5.1 Change the display brightness to the set value after brightness cal step in calibration, was only correct on exit of cal mode before. ; in BG charge, display make the XOXOOXOX pattern appear if the BG charge value is at min (0 amps) or max (25 A) ;fix reversed detection of Assist at stop function to properly turn off assist at stop if option 1 is in the default condition ;1.5.2 Add config bit 3. "OPFL2". When set, The full joystick range will represent ony 50% assist rather than 100% ;open up center dead band for CMDpwr so side jogs don;t activate by accident. ;1.5.3 Fix the no mode1 led when in MIMA on demandbug caused by the last code. ;1.5.4 make AR1 control the boost charge or activate on >15A regen, using option 4 to toggle from default(boost enable) to alternate (brake light >15A) ;1.5.5 invert the boost enable function ;1.5.6 implement max assist with four levels 25%,50%,75%,100% OPTION BIT 7 AND 6 00=100% 01=75% 10= 50% 11=25% ;1.5.8 fix really slow routine by removing BSF NEWSPEED to eliminate the pima restart glitch list p=18f452 ; list directive to define processor #include p18f452.inc errorlevel -302 LIST CONFIG OSC = ECIO,OSCS = OFF,PWRT = OFF,BOR = ON,WDT = OFF,CCP2MUX = ON,STVR = OFF,LVP = OFF,DEBUG = OFF ;Port A assignments: <---- in ------> out ;RA0/AN0 <------Analog Joystick in ;RA1/AN1 <------Analog Aux joystick in ;RA2/AN2 <------Analog Battery amps 2V = 0 amps ;RA3/AN3 <------Analog Battery temp ;RA4/TOCK1 ------->Digital CMDPWR PWM out to MCM ;RA5/AN4 <------Analog MPI temp ;RA6 ------->Digital AR1 POWER TRANSISTOR OUT ; ; ;Port B assignments: <---- in ------> out ;RB0/INT O <----- CMDPWR pulses from ECM ;RB1/INT 1 <----- Joystick switch ;RB2/INT 2 <----- Vss pulses Tock1 ;RB3 <----- SW 1 right sw ;RB4 ------> All fans ;RB5 ------> Aux open collector out ;RB6 <----> ICD-2 Debugging and programing data ;RB7 <----> ICD-2 Debugging and programing control ;Port C assignments: <---- in ------> out ;RC0/t1ck1 <------ mode2 sw ;RC1/CCP2 ------> Display brightness PWM ;RC2/CCP1 ------> MAMODE1 PWM ;RC3 ------> ASSIST ENABLED ;RC4 ------> MODE 3 LED ;RC5 ------> MODE 2 LED ;RC6 ------> MODE 1 LED ;RC7 ------> MIMA standby ; ;Port D assignments: ;RD0 ------> Amp out red led 4 ;RD1 ------> Amp out red led 3 ;RD2 ------> Amp out red led 2 ;RD3 ------> Amp out red led 1 ;RD4 ------> Amp in green led 1 ;RD5 ------> Amp in green led 2 ;RD6 ------> Amp in green led 3 ;RD7 ------> Amp in green led 4 ; ;Port E assignments: ;RE0/AN5 <------ Analog Throttle position sensor ;RE1/AN6 <------ Analog MAP sensor ;RE2/AN7 <------ Analog Ambient light sensor ;Variables cblock 0x000 FLAG1 ;FLAG1 BIT0 = MODE 1 ACTIVE FLAG H=ON LO= IMA ;FLAG1 BIT1 = MODE 2 ACTIVE FLAG H=ON LO= IMA ;FLAG1 BIT2 = MODE 3 ACTIVE FLAG H=ON LO=IMA ;FLAG1 BIT3 = KEYDEBOUNCE ACTIVE H= DEBOUNCE LO=DEBOUNCE FINISHED ;FLAG1 BIT4 = BGPAUSEFLG 1 IF MIMA IS PAUSED BECAUSE OF LOW SPEED ;FLAG1 BIT5 = VSSTOPED(HAVE BEEN STOPPED FOR 25 SECONDS) ;FLAG1 BIT6 = NEW SPEED UPDATE HAS HAPPENED ;FLAG1 BIT7 = PIMAPAUSEFLG 1 IF PIMA WAS ON WHEN SPEED WENT BELOW THRESHOLD FLAG2 ;FLAG2 BIT0 = 1/8 SEC TIMER FLAG ;FLAG2 BIT1 = TEN SEC TIMER FLAG ;FLAG2 BIT2 = KEYHOLDFLAG MODE2 SW WAS HELD ;FLAG2 BIT3 = FORCED mima(JOYSTICK MOVED) ;FLAG2 BIT4 = HARD mima (KEY ACTIVATED) ;FLAG2 BIT5 = LONGHOLD ;FLAG2 BIT6 = MAPINIT 1=init ok ;FLAG2 BIT7 = M2CAL FLAG3 ;FLAG3 BIT0 = WASREGEN =0 IF ASSIST, =1 IF REGEN SET IN JOYMOVED ;FLAG3 BIT1 = STOP AMP DISPLAY WHEN HIGH ;FLAG3 BIT2 = JOGASSIST FLAG 1= ALREADY BEEN SAVED0= NOT SAVED YET ;FLAG3 BIT3 = JOGREGEN FLAG 1= ALREADY BEEN SAVED0= NOT SAVED YET ;FLAG3 BIT4 = EXPCHARGE flag 1= do expanded charge scale ;FLAG3 BIT5 = BGCHARGE FLAG=0 NO BACKGROUND CHARGE 1= BGCHARGE ALLOWED ;FLAG3 BIT6 = TOBLINK 0=NO BLINK 1= BLINKALLOWS THE BLINK ROUTIN TO FLASH LED ;FLAG3 BIT7 = JOYLOCK 0= NO LOCK 1= LOCK PRESENT POSITION TILL MAP CHANGE FLAG4 ;FLAG4 BIT0 = JOYCALMODE 0=NOT IN MODE 1=IN MODE ;FLAG4 BIT1 = JOYCALINIT 0=NOT INIT 1= HAS BEEN INITILIZED ;FLAG4 BIT2 = JOYCALOK 0=NOT PROGRAMMED 1=PROGRAMMED ;FLAG4 BIT3 = BSPJOG JOG OR SHIFT SETPOINT WHEN IN ABC 0=ABC CHARGE VALUE 1=ABC SETPOINT ;FLAG4 BIT4 = AMPPWM 0=SKIP PWM 1= DO PWM ;FLAG4 BIT5 = JOYRTC 0==BACK TO CENTER 1=HAVE NOT BEEN BACK TO CENTER ;FLAG4 BIT6 = SPCROSS 0=SETPOINTS OK 1= SETPOINTS TRYING TO CROSS ;FLAG4 BIT7 = JOYFLAG ;JOYFLAG BIT0 = XMOVEDIR 0=CHARGE 1=ASSIST < 127 > ON JOYSTICKX CORRECTED VALUES <127 = ASSIST ;JOYFLAG BIT1 = YMOVEDIR 0=JOGUP 1=JOGDN < 127 > ON JOYSTICKY CORRECTED VALUES <127 = JOGUP ;JOYFLAG BIT2 = XINDEAD 0= IN TRUE MIDDLE 1= OUT OF DEADBAND ;JOYFLAG BIT3 = YINDEAD 0= IN TRUE MIDDLE 1= OUT OF DEADBAND ;JOYFLAG BIT4 = BOTHINDEAD 0=BOTH STICKS IN DEADZONE 1= NOT IN DEADZONE ;JOYFLAG BIT5 = XJOGINMID 0=STICK IN JOG MIDDLE 1= NOT IN MIDDLE ;JOYFLAG BIT6 = YJOGINMID 0=STICK IN JOG MIDDLE 1= NOT IN MIDDLE ;JOYFLAG BIT7 = BOTHJOGINMID 0=BOTH STICKS IN JOG MIDDLE 1= NOT IN MIDDLE CALMODE ;COUNTS PRESSES OF MODE2KEY WHEN IN M2CAL ; THE FLASH NON VOLITILE MEMORY STORES THE FOLLOWING: MAGFACTOR ; 1,2,3,4 SETS ASSIST MAGFACTOR ASETPOINT ;VALUE FROM AUX JOYSTICK WHEN JOYSTICK SW PRESSED RSETPOINT ;regen setpoint CHARGEBG ;THE VALUE OF THE BACKGROUND CHARGE WHEN IN MODE 1 PIMARAMPSPEED ;ramp speed for PIMA and ABC JOYRAMPSPEED ;RAMPSPEED FOR MANUAL JOYSTICK ACTION OPFLAG ;THIS FLAG BYTE IS STORED IN EEPROM ADDRESS 07 AND CONTROLS SOME OPERATING MODES ;OPFLAG BIT0 = STOPASSIST 0=ASSIST IS DISABLED 1= ASSIST WORKS AT STOP ;OPFLAG BIT1 = SWAPABCSET 0=DEFAULT WITH LEVELSET 1= DEFAULT WITH SETPOINT SET ;OPFLAG BIT2 = OPFL2 ;OPFLAG BIT3 = SWAPAR1 function swap 0=* boost charge enable 1= brake light on 15A of regen ; *turns on AR1 whenever MIMA ask for assist or regen ;OPFLAG BIT4 = OPFL4 ;OPFLAG BIT5 = OPFL5 ;OPFLAG BIT6 = MAXAB1 BIT 1 OF MAX ASSIST VALUE SETS MAX ASSIST VALUE ;OPFLAG BIT7 = MAXAB2 BIT 2 OF MAX ASSIST VALUE JOYCONFIG ;JOYCONFIG BIT0 = JOYCAL1OR5 THIS IS SET ON JOYCAL STEP 1 AND 5 WHERE THE INITIAL DIRECION IS DETERMINED ;JOYCONFIG BIT1 = JOYXYSELECT ;JOYCONFIG BIT2 = JOYXINVERT ;JOYCONFIG BIT3 = JOYYINVERT ;JOYCONFIG BIT4 = JOYCALPASS ;JOYCONFIG BIT5 = JOYFIRSTAXIS 0=X WAS FIRST, 1= Y WAS FIRST ;JOYCONFIG BIT6 = JOYCKAXIS 0= DONT CK AXIS 1= CK AXIS ;JOYCONFIG BIT7 = JOYCONFIG7 JOYXH ;THE RAW JOYSTICKH DATA FROM THE DEFAULT ASSIST/REGEN STICK JOYXL ;THE RAW JOYSTICKL DATA FROM THE DEFAULT ASSIST/REGEN STICK JOYYH ;THE RAW JOYSTICKH DATA FROM THE DEFAULT AUX STICK JOYYL ;THE RAW JOYSTICKL DATA FROM THE DEFAULT AUX STICK JOYSTICKX ;THE MODIFIED ASSIST/REGEN JOYSTICKH RAW DATA JOYSTICKY ;THE MODIFIED AUX JOYSTICKL RAW DATA JOYXMAXH ;MAX VALUE FOR X JOYSTICKH JOYXMAXL ;MAX VALUE FOR X JOYSTICKX JOYXRFMXH ;RETURN TO CENTER FROM MAX VALUE FOR X STICKH JOYXRFMXL ;RETURN TO CENTER FROM MAX VALUE FOR X STICKL JOYXMINH ;MIN VALUE FOR X JOYSTICKH JOYXMINL ;MIN VALUE FOR X JOYSTICKX JOYXRFMNH ;RETURN TO CENTER FROM MIN VALUE FOR X STICKH JOYXRFMNL ;RETURN TO CENTER FROM MIN VALUE FOR X STICKL JOYYMAXH ;MAX VALUE FOR Y JOYSTICKH JOYYMAXL ;MAX VALUE FOR Y JOYSTICKX JOYYRFMXH ;RETURN TO CENTER FROM MAX VALUE FOR Y STICKH JOYYRFMXL ;RETURN TO CENTER FROM MAX VALUE FOR Y STICKL JOYYMINH ;MIN VALUE FOR Y JOYSTICKH JOYYMINL ;MIN VALUE FOR Y JOYSTICKX JOYYRFMNH ;RETURN TO CENTER FROM MIN VALUE FOR Y STICKH JOYYRFMNL ;RETURN TO CENTER FROM MIN VALUE FOR Y STICKL ;HOLDS THE FIRST PASS VALUES DURING THE SECOND CAL PASS TJOYXMAXH ;MAX VALUE FOR X JOYSTICKH TJOYXMAXL ;MAX VALUE FOR X JOYSTICKX TJOYXRFMXH ;RETURN TO CENTER FROM MAX VALUE FOR X STICKH TJOYXRFMXL ;RETURN TO CENTER FROM MAX VALUE FOR X STICKL TJOYXMINH ;MIN VALUE FOR X JOYSTICKH TJOYXMINL ;MIN VALUE FOR X JOYSTICKX TJOYXRFMNH ;RETURN TO CENTER FROM MIN VALUE FOR X STICKH TJOYXRFMNL ;RETURN TO CENTER FROM MIN VALUE FOR X STICKL TJOYYMAXH ;MAX VALUE FOR Y JOYSTICKH TJOYYMAXL ;MAX VALUE FOR Y JOYSTICKX TJOYYRFMXH ;RETURN TO CENTER FROM MAX VALUE FOR Y STICKH TJOYYRFMXL ;RETURN TO CENTER FROM MAX VALUE FOR Y STICKL TJOYYMINH ;MIN VALUE FOR Y JOYSTICKH TJOYYMINL ;MIN VALUE FOR Y JOYSTICKX TJOYYRFMNH ;RETURN TO CENTER FROM MIN VALUE FOR Y STICKH TJOYYRFMNL ;RETURN TO CENTER FROM MIN VALUE FOR Y STICKL JOYXSFU JOYXSFD JOYYSFU JOYYSFD JOYCALSTEP ;COUNTER FOR CAL STEP ;1=MAXASSIST ;2=RETURN FROM ASSIST ;3=MAXREGEN ;4=RETURN FROM REGEN ;MODE3 LED FLASHES WHEN ON STEPS 5-8 ;5=JOGUP ;6=RETURN FROM JOGUP ;7=JOGDOWN ;8=RETURN FROM JOGDOWN JOYCALDELAY ;COUNTER THAT CONTROLS ENTRY INTO JOYCAL JOYDIRDETECT ;FLAGS THE FOUND DIRECTION, AND THE FIRST DIRECTION ;BIT0= XHI ;BIT1= XLO ;BIT2= YHI ;BIT3= YLO ;BIT4= XHI FIRST PASS ;BIT5= XLO FIRST PASS ;BIT6= YHI FIRST PASS ;BIT7= YLO FIRST PASS JOYREADCOUNTER ;COUNTS THE READS OF EACH DATAPOINT BEFORE EXCEPTING THE VALUE BTEMPH ;BATTERY TEMPHI BTEMPL ;BATTERY TEMPLO MPITEMPH ;BATTERY TEMPHI MPITEMPL ;BATTERY TEMPLO THROTTLEH ;THROTTLE RAW HI THROTTLEL ;THROTTLE RAW LO ACCALO ;16 BIT MATH LO BYTE DATA ACCAHI ;16 BIT MATH HI BYTE DATA ACCBLO ;16 BIT MATH LO BYTE COMPARE DATA ACCBHI ;16 BIT MATH HI BYTE COMPARE DATA ACCCLO ;USED IN 16X16 DIVIDE ROUTINE ACCCHI ;USED IN 16X16 DIVIDE ROUTINE ACCDHI ;USED IN 16X16 DIVIDE ROUTINE ACCDLO ;USED IN 16X16 DIVIDE ROUTINE KEYDELAYH ;DEBOUNCE TIMER HI BYTE KEYDELAYL ;DEBOUNCE TIMER LOW BYTE CORETIMER ;COUNTS MAIN LOOP PASSES CORETIMER2 TIMER.125SEC ;COUNTER FOR 1/8 SECOND TIMER AUXTIMER ;COUNTER TO GENERATE SECOND LONGER TIME DELAY MAPHI ;MAP SENSOR HI NOW MAPLO ;MAP SENSOR LO NOW AVEMAPHI ;AVERAGE MAP VALUEHI AVEMAPLO ;AVERAGE MAP VALUELO ACCMAPHI ;AVERAGE MAP ACCUMULATORHI ACCMAPL0 ;AVERAGE MAP ACCUMULATORLO MAPSCALED ; 8 BIT SCALED AVERAGE MAP VALUETMP MAPLOCK ;8 BIT SCALED VALUE AT THE TIME OF JOYSTICKLOCK AMBIENTLTHI ;AMBIENT LIGHT HI AMBIENTLTLO ;AMBIENT LIGHT LO DISPLAYBRT ;VALUE OF DISPLAY BRIGHTNESS BAMPSH ; AMP SIGNALHI BAMPSL ; AMP SIGNALLO AMPDUTY AMPDIF AMPMASK ;THIS BYTE SHOWS THE AMPPORT BIT POSITION FOR THE BIT WE ARE WORKING ON VSSHI ;SPEED DATAHI VSSLO ;SPEED DATALO SLOWSPEED ;SPEED WAS TOO SLOW FOR COUNTER, THIS COUNTS THE OVERFLOWS LOWMPHACC ;COUNTER AND MPH ANSWER ONCE VALUE HAS BEEN DETERMINED. SPEEDMSB SPEEDCORRECT MPH TMP0 ;TEMP REGISTER 0 USED IN DIVIDE,PIMAMAP,LOCKCK,CALIBRATION,INIT TMP1 ;TEMP REGISTER 1 USED IN MPY16X16,INIT TMP2 ;TEMP REGISTER 2 USED IN JOYSTICK TMP3 ;TEMP REGISTER 3 USED IN JOYCAL ABCSETPOINT M1BLINKTIME MAXASSISTVALUE ;CARRIES THE MINIMUM CMDPWR VALUE TO ALLOW EEADDRESS ;THE ADDRESS TO READ OR WRITE DATA TO ;0=brightness,1=RSETPOINT, 2= ASETPOINT,3= MAG FACTOR,4=PIMA/ABC RAMP,5=JOYSTICK RAMP,6=background charge level ;7= OPFLAG, 8= JOYCONFIG, 9= JOYXMAXH ;MAX VALUE FOR X JOYSTICKH, 10=JOYXMAXL ;MAX VALUE FOR X JOYSTICKX, ; 11=JOYXRFMXH ;RETURN TO CENTER FROM MAX VALUE FOR X STICKH, 12=JOYXRFMXL ;RETURN TO CENTER FROM MAX VALUE FOR X STICKL ;13=JOYXMINH ;MIN VALUE FOR X JOYSTICKH, 14=JOYXMINL ;MIN VALUE FOR X JOYSTICKX, 15=JOYXRFMNH ;RETURN TO CENTER FROM MIN VALUE FOR X STICKH ;16=JOYXRFMNL ;RETURN TO CENTER FROM MIN VALUE FOR X STICKL, 17=JOYYMAXH ;MAX VALUE FOR Y JOYSTICKH ;18=JOYYMAXL ;MAX VALUE FOR Y JOYSTICKX, 19=JOYYRFMXH ;RETURN TO CENTER FROM MAX VALUE FOR Y STICKH ;20=JOYYRFMXL ;RETURN TO CENTER FROM MAX VALUE FOR Y STICKL, 21=JOYYMINH ;MIN VALUE FOR Y JOYSTICKH ;22=JOYYMINL ;MIN VALUE FOR Y JOYSTICKL, 23=JOYYRFMNH ;RETURN TO CENTER FROM MIN VALUE FOR Y STICKH ;24= JOYYRFMNL ;RETURN TO CENTER FROM MIN VALUE FOR Y STICKL, 25= ABCSETPOINT MYEEDATA ;DATA TO OR FROM EEPROM endc ;*******Text replacements #DEFINE CMDPWROUT PORTA,4 ;CMDPWR OUTPUT PIN(to MCM. this is the electric throttle signal) #DEFINE AR1 PORTA,6 ;SWAPAR1 ASSIGNES THIS OUTPUT TO (DEFAULT) BOOST ENABLE, OR BRAKE LIGHT WHEN >15a #DEFINE CMDPWRIN PORTB,0 ;CMDPWR INPUT PIN (IRQ) #DEFINE JOYSW PORTB,1 ;JOYSTICK SW ON CONTROLLER #DEFINE MODE1SW PORTB,3 ;mode1 SW ON CONTROLLER(mima) #DEFINE ALLFANS PORTB,4 ;OUT TO TIP120M OPEN COLL TO TURN ON THE FANS #DEFINE AR2 PORTB,5 ;FORCED AUTO STALL ACTIVATION WHEN PRESSED IN CENTER POSITION IN ima AND mima MODES #DEFINE MODE2SW PORTC,0 ;mode 2 SW ON CONTROLLER(pima) #DEFINE ASSISTENABLED PORTC,3 ;ASSIST ENABLED TURND ON MAMODE1 RELAY AND MAMODE 2 (ECM requesting assist) #DEFINE MODE3LED PORTC,4 ;MODE 3 LED #DEFINE MODE2LED PORTC,5 ;MODE2 LED #DEFINE MODE1LED PORTC,6 ;MODE1 LED #DEFINE MIMASTANDBY PORTC,7 ;TURNS ON cmd pwr RELAY(replaces cmdpwr signal) #DEFINE AMPPORT PORTD ;PORT WITH AMMETTER LEDS #DEFINE MODE1FLAG FLAG1,0 ;1 IF IN MODE 1 Joystick control USED TO STOP MULTI ENTRY INTO SW ROUTINES #DEFINE MODE2FLAG FLAG1,1 ;1 IF IN MODE 2 Throttle control #DEFINE MODE3FLAG FLAG1,2 ;1 IF IN MODE 3 Joystick sw.MIMA if on, No mima if off #DEFINE KEYDEBOUNCE FLAG1,3 ;1 IF KEY JUST PRESSED #DEFINE BGPAUSEFLG FLAG1,4 ;SET IF STOPPED IN MODE 1 #DEFINE VSSTOPED FLAG1,5 ;THE SPEED ROUTINE OVERFLOW COUNTER HAS OVERFLOWED(STOPPED) #DEFINE NEWSPEED FLAG1,6 ;A NEW VSS PULSE HAS HAPPENED #DEFINE PIMAPAUSEFLG FLAG1,7 ;1 IF IN PIMA WHEN SPEED DROPPED BELOW PIMASTOP THRESHOLD #DEFINE SEC.125FLG FLAG2,0 ;1/8 = SEC HAS ELAPSED #DEFINE AUXTIMERFLG FLAG2,1 ;AUXTIME HAS ELAPSED #DEFINE KEYHOLDFLAG FLAG2,2 ;TOGGLE FLAG FOR SYSTEM PWM LED FLASH #DEFINE JOYMOVED FLAG2,3 ;TURNED ON WHEN mima XSTICK MOVED #DEFINE HARDMIMA FLAG2,4 ;TURNED ON WHEN mima ACTIVATED BY SWITCH(DISABLES TIME OUT) #DEFINE LONGHOLD FLAG2,5 ;MODE2 KEY WAS HELD FOR 5 SECONDS ENTER JOYCAL #DEFINE MAPINIT FLAG2,6 ;SHOWS THAT THE MAP INIT WAS DONE #DEFINE M2CAL FLAG2,7 ;FLAG TO PUT IN CAL MODE #DEFINE WASREGEN FLAG3,0 ;FLAG TO SHOW IF IN ASSIST OR REGEN #DEFINE BLANKIT FLAG3,1 ;FLAG TO disable updates to amp display #DEFINE JOGA FLAG3,2 ;0=NOT JOGGED 1=HAS BEEN JOGGED #DEFINE JOGB FLAG3,3 ;0=NOT JOGGED 1=HAS BEEN JOGGED #DEFINE EXPCHARGE FLAG3,4 ;Flag for extended sensitivity regen amp scale #DEFINE BGCHARGE FLAG3,5 ;FLAG THAT controls background charge 0=off 1=on #DEFINE TOBLINK FLAG3,6 ;0 DONT BLINK 1= BLINK #DEFINE JOYLOCK FLAG3,7 ;0 NOT LOCKED 1= LOCKED #DEFINE JOYCALMODE FLAG4,0 ;SET WHEN IN JOYCALMODE #DEFINE JOYCALINIT FLAG4,1 ;SET WHEN JOYCAL INIT IS DONE. #DEFINE JOYCALOK FLAG4,2 ;SET AFTER JOYCAL IS CONFIRMED #DEFINE BSPJOG FLAG4,3 ;JOG WHEN IN ABC 0=ABC CHARGE VALUE 1=ABC SETPOINT #DEFINE AMPPWM FLAG4,4 ;0=SKIP PWM 1=DO PWM #DEFINE JOYRTC FLAG4,5 ;0=BACK TO CENTER 1=HAVE NOT BEEN BACK TO CENTER ; #DEFINE SPCROSS FLAG4,6 ;0=SETPOINTS OK 1= SETPOINTS TRYING TO CROSS ;#DEFINE FLAG4,7 ; #DEFINE XMOVEDIR JOYFLAG,0 ;1=ASSIST 0=CHARGE < 127 > ON JOYSTICKX CORRECTED VALUES <127 = ASSIST #DEFINE YMOVEDIR JOYFLAG,1 ;0=JOGUP 1=JOGDN < 127 > ON JOYSTICKY CORRECTED VALUES <127 = JOGUP #DEFINE XINDEAD JOYFLAG,2 ;0= IN TRUE MIDDLE 1= OUT OF DEADBAND #DEFINE YINDEAD JOYFLAG,3 ;0= IN TRUE MIDDLE 1= OUT OF DEADBAND #DEFINE BOTHINDEAD JOYFLAG,4 ;0=BOTH STICKS IN DEADZONE 1= NOT IN DEADZONE #DEFINE XJOGINMID JOYFLAG,5 ;0=STICK IN JOG MIDDLE 1= NOT IN MIDDLE #DEFINE YJOGINMID JOYFLAG,6 ;0=STICK IN JOG MIDDLE 1= NOT IN MIDDLE #DEFINE BOTHJOGINMID JOYFLAG,7 ;0=BOTH STICKS IN JOG MIDDLE 1= NOT IN MIDDLE #DEFINE OPFL2 OPFLAG,2 ;NOT ASSIGNED #DEFINE STOPASSIST OPFLAG,0 ;0=DISABLED 1= ENABLED SAVED IN EEPROM #DEFINE SWAPABCSET OPFLAG,1 ;SETS WHICH FUNCTION WILL BE DEFAULT IN ABC MODE 0=LEVEL 1=SETPOINT #DEFINE SWAPAR1 OPFLAG,3 ;0= BOOST CHARGE ENABLE , 1= BRAKE LIGHT OVER 15A REGEN #DEFINE OPFL4 OPFLAG,4 ;NOT ASSIGNED #DEFINE OPFL5 OPFLAG,5 ;NOT ASSIGNED #DEFINE MAXAB1 OPFLAG,6 ;NOT ASSIGNED #DEFINE MAXAB2 OPFLAG,7 ;NOT ASSIGNED #DEFINE JOYCAL1OR5 JOYCONFIG,0 ;0= STEP 2,3,4,6,7,8 1= STEP 1 OR 5 #DEFINE JOYXYSELECT JOYCONFIG,1 ;0= DEFAULT 1= AUX=ASSIST, AND ASSIST=AUX #DEFINE JOYXINVERT JOYCONFIG,2 ;X AXIS 0= DEFAULT 1= INVERTED #DEFINE JOYYINVERT JOYCONFIG,3 ;YAXIS 0= DEFAULT 1= INVERTED #DEFINE JOYCALPASS JOYCONFIG,4 ;0=INITIAL PASS 1=SECOND PASS #DEFINE JOYFIRSTAXIS JOYCONFIG,5 ;0=X WAS FIRST, 1= Y WAS FIRST #DEFINE JOYCKAXIS JOYCONFIG,6 ;0= DONT CK AXIS 1= CK AXIS #DEFINE PWRTIMERENABLE INTCON,5 ;TMR0 ENABLE PIN #DEFINE JOYDIRXH JOYDIRDETECT,0 ;IN JOYCAL STORES THE DIRECTION THAT WAS DETECTED #DEFINE JOYDIRXL JOYDIRDETECT,1 ;AND THE DIRECTION THAT WAS FIRST DETECTED #DEFINE JOYDIRYH JOYDIRDETECT,2 #DEFINE JOYDIRYL JOYDIRDETECT,3 #DEFINE FIRJOYDIRXH JOYDIRDETECT,4 #DEFINE FIRJOYDIRXL JOYDIRDETECT,5 #DEFINE FIRJOYDIRYH JOYDIRDETECT,6 #DEFINE FIRJOYDIRYL JOYDIRDETECT,7 ;************************* CONSTANTS*********************************** MLOOPDELAY EQU D'1' ;DELAY BETWEEN EXCUTIONS OF MAIN LOOP (1)0.000316/1 ADWAIT EQU D'30' ;TIME TO DELAY TO WAIT FOR SETTLING OF SH CAP(10) KEYWAITL EQU D'200' ;TIME TO DELAY CHECKING KEYS AS A DEBOUNCE(100-255)LO BYTE KEYWAITH EQU D'2' ;TIME TO DELAY CHECKING KEYS AS A DEBOUNCE(2)HIGH BYTE SEC.125CONST EQU D'5' ;COUNTS TO MAKE 1/8 SECOND(5) TIMEBASECOR EQU D'12' ;CORRECTS TIMEBASE FOR EXACT SECOND INTERVAL(12) JOYOFFSET equ D'116' ;SHIFTS RESULT OF JOYSTICK A/D READING TO CENTER THE STICK AUXTIMEINIT EQU D'20' ;SETS THE NUMBER OF USED FOR KEYHOLD2 TEMPHYSTER EQU D'16' ;TEMPERATURE HYSTERYSIS VALUE FOR FANS OFF 4=1DEG C(12=3DEGC) THROTMOVETHRES EQU D'50' ;DETERMINES HOW BIG A MOVE WILL TRIGGER THE THROTTLE ROC DETECT PIMASTOP EQU D'19' ;SETPOINT speedTO STOP MAPAUTOMODE SO AUTOSTOP WILL NOT ACTIVATE FULL ASSIST BGSTOP EQU D'5' ;SETPOINT IN MPH WHERE BG CHARGE WILL PAUSE. JOGVALUE EQU D'2' ;AMOUNT JOG INCREMENTS OR DECREMENTS THE CALIBRATION VALUES SETRAMPSPEED EQU D'40' ;VALUE USED IN INIT TO SET RAMP RATE OF CHANGE COUNTS.SMALLER NUMBER FASTER RAMP,BIGGER NUMBER,SLOWER RATE MAPWINDOW EQU D'20' ;THE MAPSCALED VALUE IS STORED WHEN THE JOYLOCK IS ACTIVATED. THIS VALUE ;IS ADDED TO SET THE UPPER THRESHOLD FOR LOCK RELEASE, THEN SUBTRACTED TO SET ;THE LOW THRESHOLD OF THE LOCK RELEASE. JOYCALWAIT EQU D'254' ;TIMES THAT JOYCAL IS ENTERED BEFORE ENTRY IS ALLOWED BRTOFFSET EQU D'40' ;OFFSET FOR BRIGHTNESS ADJ TO ASSURE THAT IT CAN REACH 0 JOYMATCHVAL EQU D'2' ;ALLOWED DIFFERENCE WHEN ACCEPTING NEW JOYCAL VALUE ACQUISITION AS A MATCH JOYPADVALUE EQU D'10' ;VALUE ADDED OR SUBTRACTED FROM THE JOYCAL LIMITS TO ALLOW ROOM AT ENDS ABCJOGVALUE EQU D'2' ;SIZE OF ABC SETPOINT JOG CORETIMECOR EQU D'200' ;CHANGES CORE TIMER PERIODTO 200HZ CORE2TIMECOR EQU D'25' ASSISTLEVEL EQU D'174' ;CMDPWR ASSIST THRESHOLD FOR RELAY ACTIVATION CHARGELEVEL EQU D'184' ;CMDPWR CHARGE THRESHOLD FOR RELAY ACTIVATION JOGTHRESLO EQU D'100' ;VALUE FOR JOGLO THRESHOLD THAT DETERMINES IF A JOG HAPPENED JOGTHRESHI EQU D'154' ;VALUE FOR JOGHI THRESHOLD THAT DETERMINES IF A JOG HAPPENED THREEQUARTER EQU D'136' ;CMDPWRVALUE FOR 3/4 ASSIST 121 IS MAX ASSIST 179 MID 240 MAX REGEN HALFASSIST EQU D'150' ;CMDPWRVALUE FOR 1/2 ASSIST ONEQUARTER EQU D'164' ;CMDPWRVALUE FOR 1/4 ASSIST ;********************************************************************** ORG 0x000 ; processor reset vector GOTO main ; go to beginning of program ;********************************************************************** ORG 0x008 ; interrupt vector location ;********************************************************************** cblock w_temp ; variable used for context saving status_temp ; variable used for context saving BSR_TEMP ;place to save bsr register endc MOVWF W_TEMP ;SAVE STATUS AND W REG MOVFF STATUS,STATUS_TEMP MOVFF BSR,BSR_TEMP BCF INTCON,7 ;DISABLE ALL INTERUPTS BTFSS PIR1,1 ;TIMER 2MATCH GOTO NOT2 BCF PIR1,1 DECFSZ CORETIMER GOTO NOT2 ;.005SEC(200HZ)TIMER BTFSS AMPPWM ;TEST AMPPWM FLAG GOTO CONTCTIMER MOVFF AMPDUTY,TMR3H ;255=100% 61=1% BSF PIE2,1 ;ENABLES T3 INTERRUPT BSF T3CON,0 ;TURNS ON TIMER3 COMF AMPMASK,W ;INVERT MASK IORWF AMPPORT ;SHOULD TURN IT BACK ON CONTCTIMER MOVLW CORETIMECOR ; MOVWF CORETIMER ; DECFSZ CORETIMER2 GOTO NOT2 MOVLW CORE2TIMECOR MOVWF CORETIMER2 CALL TIMEBASE GOTO NOT2 NOT2 BTFSS PIR2,1 ; TIMER 3 IS AMP LED DUTYCYCLE COUNTER GOTO NOT3 ;CK IF TIMER 3 CAUSED INTERUPT BCF PIR2,1 ;CLEAR TIMER 3 OVERFLOW INT. BCF T3CON,0 ;TURNS OFF T3 BTFSS AMPPWM GOTO NOT3 MOVF AMPMASK,W ;GET MASK FOR THIS LED ANDWF AMPPORT ;WILL TURN OFF THE APPROPRIATE LED(i HOPE) NOT3 BTFSS INTCON,2 ;CK IF TMRO CAUSED THE INT. GOTO NOTTMR0 ;TIMER 0 IS THE DUTYCYCLE TIMER FOR THE CMDPWR PULSE WHEN IT TIMES OUT ;THE CMDPWR PIN GOES LOW BCF INTCON,2 ;CLEAR THE INT FLAG BIT BCF T0CON,7 ;TURN OFF TIMER0 BSF CMDPWROUT ;SET CMDPWR PIN BCF PWRTIMERENABLE ;TURN OFF TIMER 0 INT ;(PULSE ONLY HAPPENS WHEN MIMA IS ACTIVE) NOTTMR0 BTFSS INTCON,1 ;CK IF CMDPWR PULSE WENT HIGH(INT0) GOTO NOTCMDPWR MOVFF CMDPWRVALUE,TMR0L ; CMDPWR VALUE IS PRELOADED INTO TIMER0 L REGISTER MOVF MAXASSISTVALUE,W ;GET MAX ASSIST VALUE INTO W SO WE CAN TEST IF OVER MAX CPFSGT CMDPWRVALUE ; IF OVER MAX, REPLACE TIMER0 WITH MAX LEVEL MOVFF MAXASSISTVALUE,TMR0L BCF INTCON,1 ;CLEAR THE INT0 BIT BSF PWRTIMERENABLE ;ENABLE TIMER0 BCF CMDPWROUT ;CLEAR PIN BSF T0CON,7 ;TURN ON TIMER0 NOTCMDPWR BTFSS INTCON3,1 ;CK IF INT2 (VSS) CAUSED INTERUPT GOTO NOTVSS NOP ;THE VSS INPUT PIN(INT2) WENT HIGH READ TIMER THEN RESET IT BCF INTCON3,1 ;CLEAR THE INT2 FLAG BCF T1CON,0 ;TURNS OFF TIMER1 MOVFF TMR1H,VSSHI ;READ TIMER1 MOVFF TMR1L,VSSLO CLRF TMR1H ;CLEAR TIMER 1 CLRF TMR1L BSF T1CON,0 ;START TIMER 1 BSF NEWSPEED ;SPEED DATA NOW VALID BCF VSSTOPED ;GOT A NEW PULSE RESET MOVFF SLOWSPEED,SPEEDCORRECT ;SAVE OVERFLOWS AT TIME OF NEXT PULSE CLRF SLOWSPEED NOTVSS BTFSS PIR1,0 ;CK IF TIMER 1 CAUSED INTERUPT (OVER 65535 COUNTS) GOTO FINISHISR INCF SLOWSPEED,F ;TIMER OVERFLOW SPEED TOO SLOW<8mph COUNTS OVERFLOWS BTFSC STATUS,C ;SEE IF IT OVERFLOWED GOTO REALLYSLOW ;IF CAR STOPPED FOR >25 SECONDS MOVLW D'7' ;IF COUNT IS > 8, CALL IT A STOP CPFSGT SLOWSPEED GOTO CLEARIT CALL STOPPED CLEARIT BCF PIR1,0 ;CLEAR THE INTERUPT FLAG FINISHISR MOVFF BSR_TEMP,BSR ;RESTORE BSR MOVF W_TEMP,W ;RESTORE WREG MOVFF STATUS_TEMP,STATUS ;RESTORE STSTUS RETFIE ; RETURN from interrupt REALLYSLOW BCF PIR1,0 ;CLEAR THE INTERUPT FLAG BSF VSSTOPED ;IF STOPPED FOR >25 SEC SET THE FLAG CLRF MPH GOTO FINISHISR ;************************************************************************ ;************************************************************************ ORG 0X0E8 RETURN ;******************************************************************************** main NOP NOP CALL init ; go to init code to initilize the processor CLRF AMPPORT loopstart BTFSC SEC.125FLG ;SEE IF 1/8 SEC HAS TRANSPIRED TIMEBASE SETSFLAG CALL DO.125SEC ;GO DO QUARTER SEC STUFF THEN CLEAR FLAG BTFSC AUXTIMERFLG CALL DOAUXTIMER CALL GETKEYS ;checks keys CALL LOSPEEDTEST CALL DOCONVERSIONS ;GET ANALOG INPUT FOR ALL ANALOG INPUTS BTFSS JOYCALMODE ;IF IN JOYCAL, DONT DO CORRECTIONS CALL JOYCORRECTION BTFSS M2CAL ;SKIP AMPS IF IN CAL MODE CALL AMPS ;displays amps CALL GETSPEED BTFSS MODE2FLAG ;DONT ALLOW JOYSTICKMODE IN PIMA CALL READJOYSTICK ;joystick modereads stick,scaled it,detects if in center CALL JOYMIDCK BTFSC HARDMIMA ;SET IF mima WAS ACTIVATED BY KEY CALL BACKGROUNDCH ;ONLY DO IN MODE1 BTFSC HARDMIMA ;ONLY DO JOGBG IN MODE 1 MIMA ACTIVE CALL BGJOG BTFSC MODE2FLAG CALL PIMAMAP ;DO pima CALL POWEROUT BTFSS JOYCALMODE CALL RAMPCMDPWR ;RAMP ROUTINE FOR CMDPOWER BTFSC M2CAL CALL DOBRIGHT ;ONLY DOES IN CAL MODE BTFSC JOYLOCK ;IF LOCKED CHECK IF TIME TO RLEASE CALL LOCKCHECK BTFSC JOYCALMODE CALL JOYCAL BTFSC TOBLINK CALL BLINKOPFLAG CALL BOOSTCHARGECK CALL MLOOPDLY BTFSS JOYCALOK GOTO LOOPSTART BSF MODE3LED BSF JOYCALMODE GOTO LOOPSTART ;********************************************************************** ;The VSS pulse rising edge generates an interupt(int2) timer1 is started in the ISR, ;on the next pulse ISR, the counter is stopped, the count transfered to VSSHI,VSSLO, the ;counter is cleared and restarted. ;clock = 625,000/sec ;clock/10/count/10= frequency of pulses in HZ ;the frequency of the VSS pulses in HZis nearly the same as the actual MPG.(close enough for now) ;Need to finish the MPH scale on the low end. ;********************************************************************** GETSPEED BTFSS NEWSPEED ;IF SPEED HAS NOT BEEN UPDATED SINCE LAST PASS RETURN ;SKIP ROUTINE BCF NEWSPEED ;NEW SPEED WILL BE PROCESSED, SO CLEAR FLAG MOVFF SPEEDCORRECT,SPEEDMSB ;IN CASE THE SPEED IS UPDATED, USE DIFFERENT VARIABLE MOVF SPEEDCORRECT,W ;BRING OVERFLOW COUNTER INTO W IF SPEED IS BNZ TOOSLOW ;IF COUNTER HAS OVERFLOWED (SLOW SPEED)NOT ZERO GO TO SLOW SPEED TO DETERMINE THE MOVLW D'10' MOVWF ACCALO ;WILL DIVIDE THE ACTUAL COUNTS BY 10 CLRF ACCAHI MOVFF VSSHI,ACCBHI MOVFF VSSLO,ACCBLO CALL DIVIDE MOVFF ACCBHI,ACCAHI MOVFF ACCBLO,ACCALO MOVLW H'F4' ; H'F424' = 62,500 OR THE COUNTS PER SEC/10 OR THE COUNTS/.1SEC MOVWF ACCBHI MOVLW H'24' MOVWF ACCBLO CALL DIVIDE MOVFF ACCBLO,MPH ;save the frequency in MPH RETURN ORG 0X200 ;********************************************************************** ;THE VSS PULSE PERIOD WAS GREATER THAN THE COUNTER CAN COUNT, SO WE COUNT THE OVERFLOWS AND SAVE THE RESULT ;IN SPEEDCORRECT AND CONVERT TO MPH **** ROUTINE NOT PERFECT ;8 mph IS NEVER FOUND ;RUNS THROUGH THE SETPOINTS FOR 1,2,3,4,5,6,7,8,9 MPH, AND SETS THE VALUE ONCE IT GETS A MATCH ;********************************************************************** STOPPED CLRF MPH ;LESS THAN 1 MPH SO CLEAR MPH TO ZERO CLRF PCLATH RETURN TOOSLOW BCF STATUS,C ;ACTUAL SPEED COUNT HAS OVERFLOWED, SO WE RRCF SPEEDMSB,F ;NEED TO SCALE THE REAL COUNT TO A MAX OF 32767 RRCF VSSHI,F ;AT THE 1 mph RATE.(505,383 COUNTS) RRCF VSSLO,F ;COUNTER AND OVERFLOW /2 BCF STATUS,C RRCF SPEEDMSB,F RRCF VSSHI,F RRCF VSSLO,F ;COUNTER AND OVERFLOW /4 BCF STATUS,C RRCF SPEEDMSB,F RRCF VSSHI,F RRCF VSSLO,F ;COUNTER AND OVERFLOW /8 BCF STATUS,C RRCF SPEEDMSB,F RRCF VSSHI,F RRCF VSSLO,F ;COUNTER AND OVERFLOW /16.** THE total VALUE FOR 1 MPH IS NOW less than 32000 TSTFSZ SPEEDMSB ; IF OVERFLOW COUNTER IS NOT ZERO, THE SPEED IS LESS THAN 1MPH GOTO STOPPED ; consider this stopped ;******* ;the scaled raw counter value is compared with the values for 8,7,6,5,4,3,2,1. ; LOWMPHACC holds the final MPH value which is transfered to the MPG variable ;******* MOVLW D'2' MOVWF PCLATH ;SET PCLATH FOR TABLE READS MOVLW D'10' ;SET UP FOR 9MPH TEST(DECREMENTS BEFORE STARTING) MOVWF LOWMPHACC ISSLOWER DCFSNZ LOWMPHACC,F GOTO STOPPED nextpnt BCF STATUS,C RLNCF LOWMPHACC,W ;PUT TEST MPHx2 IN W (2 bytes per instruction) CALL GETSETLO ;JUMP TO LOOK UP TABLE MOVWF ACCALO ;GET SETPOINTLO BYTE BCF STATUS,C RLNCF LOWMPHACC,W ;PUT TEST MPHx2 IN W CALL GETSETHI MOVWF ACCAHI ;GET SETPOINT HIGH BYTE MOVFF VSSLO,ACCBLO MOVFF VSSHI,ACCBHI MOVLW D'7' CPFSLT SPEEDCORRECT GOTO STOPPED CPFSEQ SPEEDCORRECT GOTO DOCOMPARE GOTO STOPPED DOCOMPARE CALL DOUBLESUB BTFSS STATUS,N GOTO ISSLOWER ;IS VALUE < SETPOINT? MOVFF LOWMPHACC,MPH ;IS VALUE > SETPOINT? CLRF PCLATH RETURN GETSETLO ADDWF PCL RETLW D'0' ;DUMMY RETLW H'62' ;LOBYTE FOR 1MPH RETLW H'BE' ;LOBYTE FOR 2MPH RETLW H'25' ;LOBYTE FOR 3MPH RETLW H'CF' ;LOBYTE FOR 4MPH RETLW H'93' ;LOBYTE FOR 5MPH RETLW H'66' ;LOBYTE FOR 6MPH RETLW H'67' ;LOBYTE FOR 7MPH RETLW H'27' ;LOBYTE FOR 8MPH RETLW H'65' ;LOBYTE FOR 9MPH RETURN GETSETHI ADDWF PCL RETLW D'0' ;DUMMY RETLW H'76' ;HIBYTE FOR 1MPH RETLW H'3E' ;HIBYTE FOR 2MPH RETLW H'2A' ;HIBYTE FOR 3MPH RETLW H'1F' ;HIBYTE FOR 4MPH RETLW H'19' ;HIBYTE FOR 5MPH RETLW H'15' ;HIBYTE FOR 6MPH RETLW H'12' ;HIBYTE FOR 7MPH RETLW H'01' ;HIBYTE FOR 8MPH RETLW H'0E' ;HIBYTE FOR 9MPH ;********************************************************************** ;********************************************************************** ;TEST IF SPEED BELOW PIMA THRESHOLD ;********************************************************************** LOSPEEDTEST MOVLW PIMASTOP ;CK IF SPEED TO LOW FOR pima CPFSGT MPH GOTO TOSLOWFORPIMA ;YES TOO SLOW BTFSS PIMAPAUSEFLG ;SPEED OK, ARE WE IN MIMA PAUSED? GOTO TESTBGSPEED ;NO SO CONTINUE WITH BG TEST CALL PIMAON ;YES SO TURN PIMA ON, CLEAR PAUSED FLAG TESTBGSPEED MOVLW BGSTOP CPFSGT MPH GOTO TOSLOWFORMIMA BTFSS BGPAUSEFLG RETURN CALL MODE1ON BSF HARDMIMA RETURN TOSLOWFORPIMA BTFSC PIMAPAUSEFLG CALL BLINKPIMA BTFSS MODE2FLAG ;ARE WE IN PIMA? GOTO TESTBGSPEED ;NO GO TO BG SPEED TEST CALL PAUSEPIMA ;WE ARE IN pima, TURN IT OFF AND SET PAUSED FLAG GOTO TESTBGSPEED TOSLOWFORMIMA BTFSS BGPAUSEFLG GOTO MIMATEST BCF BSPJOG ;TURN OFF ABCJOGSETPOINT MODE CLRF M1BLINKTIME CALL BLINKMODE1 MIMATEST BTFSS MODE1FLAG ;ARE WE IN MIMA? RETURN CALL MODE1PAUSE ;WE ARE IN MIMA, TURN IT OFF AND SET PAUSED FLAG RETURN ;********************************************************************** ;CHECKS IF IN ASSIST OR REGEN AND ACTIVATES AR1 IF WE ARE BOOSTCHARGECK BTFSC SWAPAR1 ;CHECK FLAG TO SEE IF THIS MODE IS ACTIVE RETURN MOVLW CHARGELEVEL ;REGEN MODE CPFSGT CMDPWRVALUE ;IF CMDPWR IS > CHARGE LEVEL SET AR1 GOTO TESTASSIST BTFSC AR1 BCF AR1 ;TURN ON BOOST ENABLE RETURN TESTASSIST MOVLW ASSISTLEVEL CPFSLT CMDPWRVALUE ;IF CMDPWR IS < ASSIST ACTIVATION SET AR1 GOTO NOBOOST BTFSC AR1 BCF AR1 ;TURN ON BOOST ENABLE RETURN NOBOOST BTFSS AR1 ; IS AR1 OFF? GOTO TURNBOOSTOFF RETURN TURNBOOSTOFF BSF AR1 RETURN ;********************************************************************** ;********************************************************************** ;SCALES CONFIGS JOYSTICK DATA BY DETERMINING IF IN OR OUT OF THE DEADBAND, IF OUT, WE DETERMINE THE DIFFERENCE BETWEEN THE ;DEADBAND AND THE PRESENT VALUE. WE THEN SCALE THE ACTUAL VALUE TO AN 8 BIT VALUE CENTERED ON 127. IF IN THE DEADBAND, ;THE RETURNED VALUE WILL ALWAYS BE 127. NEXT WE LOOK AT THE JOYCONFIG TO DETERMINE THE AXIS AND POLARITY OF THE VALUE, ;AND PLACE THE CORRECTED VALUE IN THE X OR Y JOYSTICK VARIABLE. ;********************************************************************** JOYCORRECTION MOVFF JOYXMAXH,ACCBHI ;START BY TESTING FOR ACTUAL STICK THAT IS> MAX MOVFF JOYXMAXL,ACCBLO ;IF SO FORCE TO JOY MAX MOVFF JOYXH,ACCAHI ;SINCE THE MAX IS THE MINIMUM MAX, A STICK CAN EXCEED THE MAX MOVFF JOYXL,ACCALO ;SO WE TEST ALL LIMITS AND CLAMP THE MAX AND MIN TO THE CONFIG MAX AND MIN. CALL DOUBLESUB BTFSS STATUS,N GOTO CKYMAX MOVFF JOYXMAXH,JOYXH MOVFF JOYXMAXL,JOYXL CKYMAX MOVFF JOYYMAXH,ACCBHI MOVFF JOYYMAXL,ACCBLO MOVFF JOYYH,ACCAHI MOVFF JOYYL,ACCALO CALL DOUBLESUB BTFSS STATUS,N GOTO CKXMIN MOVFF JOYYMAXH,JOYYH MOVFF JOYYMAXL,JOYYL CKXMIN MOVFF JOYXMINH,ACCAHI MOVFF JOYXMINL,ACCALO MOVFF JOYXH,ACCBHI MOVFF JOYXL,ACCBLO CALL DOUBLESUB BTFSS STATUS,N GOTO CKYMIN MOVFF JOYXMINH,JOYXH MOVFF JOYXMINL,JOYXL CKYMIN MOVFF JOYYMINH,ACCAHI MOVFF JOYYMINL,ACCALO MOVFF JOYYH,ACCBHI MOVFF JOYYL,ACCBLO CALL DOUBLESUB BTFSS STATUS,N GOTO CKJOYVAL MOVFF JOYYMINH,JOYYH MOVFF JOYYMINL,JOYYL CKJOYVAL MOVFF JOYXH,ACCBHI ;START BY TESTING FOR JOYVALUE >DEADBAND MOVFF JOYXL,ACCBLO MOVFF JOYXRFMXH,ACCAHI MOVFF JOYXRFMXL,ACCALO CALL DOUBLESUB BTFSS STATUS,N GOTO XWASPOS ;YES IT WAS > MOVFF JOYXH,ACCAHI ; NO IT WAS NOT> MOVFF JOYXL,ACCALO MOVFF JOYXRFMNH,ACCBHI MOVFF JOYXRFMNL,ACCBLO CALL DOUBLESUB BTFSC STATUS,N GOTO XINDEADBAND MOVFF ACCBHI,ACCAHI ;TAKE THE DIFFERENCE AND MPY BY 10 MOVFF ACCBLO,ACCALO CLRF ACCCHI MOVLW D'10' MOVWF ACCCLO CALL MPY16X16 ;RESULT IN ACCBHI/LO CLRF ACCAHI MOVFF JOYXSFD,ACCALO ;GET SCALE FACTOR CALL DIVIDE MOVFF ACCBLO,JOYSTICKX MOVLW D'127' CPFSGT JOYSTICKX ;IF >127 FORCE TO 127 GOTO XDFINAL MOVWF JOYSTICKX XDFINAL MOVLW D'128' BCF STATUS,C SUBFWB JOYSTICKX,F GOTO DOYSTICK XINDEADBAND MOVLW D'127' MOVWF JOYSTICKX GOTO DOYSTICK XWASPOS MOVFF ACCBHI,ACCAHI ;TAKE THE DIFFERENCE AND MPY BY 10 MOVFF ACCBLO,ACCALO CLRF ACCCHI MOVLW D'10' MOVWF ACCCLO CALL MPY16X16 ;RESULT IN ACCBHI/LO CLRF ACCAHI MOVFF JOYXSFU,ACCALO ;GET SCALE FACTOR CALL DIVIDE MOVFF ACCBLO,JOYSTICKX MOVLW D'127' CPFSGT JOYSTICKX ;IF >128 FORCE TO 127 GOTO XUFINAL MOVWF JOYSTICKX XUFINAL MOVLW D'127' ADDWF JOYSTICKX,F DOYSTICK MOVFF JOYYH,ACCBHI ;START BY TESTING FOR JOYVALUE >DEADBAND MOVFF JOYYL,ACCBLO MOVFF JOYYRFMXH,ACCAHI MOVFF JOYYRFMXL,ACCALO CALL DOUBLESUB BTFSS STATUS,N GOTO YWASPOS ;YES IT WAS > MOVFF JOYYH,ACCAHI ; NO IT WAS NOT> MOVFF JOYYL,ACCALO MOVFF JOYYRFMNH,ACCBHI MOVFF JOYYRFMNL,ACCBLO CALL DOUBLESUB BTFSC STATUS,N GOTO YINDEADBAND MOVFF ACCBHI,ACCAHI ;TAKE THE DIFFERENCE AND MPY BY 10 MOVFF ACCBLO,ACCALO CLRF ACCCHI MOVLW D'10' MOVWF ACCCLO CALL MPY16X16 ;RESULT IN ACCBHI/LO CLRF ACCAHI MOVFF JOYYSFD,ACCALO ;GET SCALE FACTOR CALL DIVIDE MOVFF ACCBLO,JOYSTICKY MOVLW D'127' CPFSGT JOYSTICKY ;IF >127 FORCE TO 127 GOTO YDFINAL MOVWF JOYSTICKY YDFINAL MOVLW D'128' BCF STATUS,C SUBFWB JOYSTICKY,F GOTO MAKECONFIGCOR YINDEADBAND MOVLW D'127' MOVWF JOYSTICKY GOTO MAKECONFIGCOR YWASPOS MOVFF ACCBHI,ACCAHI ;TAKE THE DIFFERENCE AND MPY BY 10 MOVFF ACCBLO,ACCALO CLRF ACCCHI MOVLW D'10' MOVWF ACCCLO CALL MPY16X16 ;RESULT IN ACCBHI/LO CLRF ACCAHI MOVFF JOYYSFU,ACCALO ;GET SCALE FACTOR CALL DIVIDE MOVFF ACCBLO,JOYSTICKY MOVLW D'127' CPFSGT JOYSTICKY ;IF >128 FORCE TO 128 GOTO YUFINAL MOVWF JOYSTICKY YUFINAL MOVLW D'127' ADDWF JOYSTICKY,F MAKECONFIGCOR BTFSC JOYXINVERT CALL INVERTX ;INVERTS X(RAW) JOYSTICK VALUES BTFSC JOYYINVERT CALL INVERTY ;INVERTS Y(RAW) JOYSTICK VALUES BTFSC JOYXYSELECT ;IS JOYASSIGNMENT REVERSED? GOTO REVERSEXY ;CHANGES ASSIGNMENT OF X AND Y JOYSTICKS RETURN INVERTX COMF JOYSTICKX,F DECF JOYSTICKX,F RETURN INVERTY COMF JOYSTICKY,F DECF JOYSTICKY,F RETURN REVERSEXY MOVFF JOYSTICKX,TMP3 MOVFF JOYSTICKY,JOYSTICKX MOVFF TMP3,JOYSTICKY RETURN ;********************************************************************** ;CALIBRATE THE JOYSTICKS BOTH FOR DEADBAND, AND AXIS SELECTION, ;IF 2 STICKS ARE USED, THEY MUST BOTH BE PLUGGED IN NOW. ;THE CAR MUST BE STOPPED (mph=0) AND THE MODE2 SWITCH HELD FOR 4 SECONDS TO ENTER THIS MODE. THE ;MODE3 LED WILL LIGHT STEADY, AND THE JOYSTICK IS DISABLED FROM CHANGING DUTYCYCLE DURING THE PROCEDURE. ;WE WILL MAKE 8 PASSES THROUGH THE ROUTINE FOR THE COMPLER TEST OF BOTH AXIS, TO ASSURE THAT WE ARE GETTING A WORSE CASE FOR EACH CONDITION. ; THE FIRST MOVE OF EITHER OF THE STICKS WILL DETERMINE THE AXIS THAT WILL BE ASSIGNED TO ASSIST AND THE DIRECTION ; OF MOTION FOR ASSIST, AND THIS WILL BE STORED IN FLASH AS THE AXIS AND DIRECTION FOR THE STICKS. I WILL USE ONE BYTE ;TO SAVE THE AXIS/DIRECTION CONFIG BITS. AND REMOVE THEM FROM THE CAL OPTION BYTE SO THE JOYSTICK STUFF WILL BE SEPARATE. ;THE WORSE CASE JOYSTICK LIMITS AND CENTER DEADBAND LIMITS FOR BOTH AXIS WILL BE DETERMINED AND STORED IN 16 BYTES OF FLASH.(10 BIT VALUES) ;THE VALUES WILL BE USED TO ASSURE PROPER CENTERING AND FULL RANGE OF CONTROL, WITH THE WIDE JOYSTICK CENTERING AND LIMIT TOLERANCES ;THAT THE JOYSTICK HAS SHOWN. ; THE MAX VALUE THAT IS THE LOWEST, THE MIN VALUE THAT IS THE HIGHEST, THE MAXTOCENTER VALUE THAT IS HIGHEST, AND THE MIN TO CENTER VALUE THAT IS MIN ;WILL BE STORED, WITH A SLIGHT OFFSET ADDED OR SUBTRACTED TO ASSURE FULL RANGE OF OPERATION. ;********************************************************************** ;JOY AXIS CONFIG BITS ;JOYXYSELECT 0= ASSIST/CHARGE IS ON X JOYSTICK 1=ASSIST/CHARGE IS ON Y JOYSTICK ;JOYXINVERT 0= ASSIST IS JOY MIN 1= ASSIST IS JOY MAX ;JOYYINVERT 0= JOGUP IS JOYMIN 1= JOGUP IS JOY MAX JOYCAL BTFSC JOYCALINIT GOTO STARTJOYCAL BSF BLANKIT ;TURN OFF AMP DISPLAY BCF AMPPWM ;TURN OFF AMPPWM(SET IS OFF) MOVLW D'1' ;SET UP THE COUNTERS FOR THE CAL STEP AND PASS MOVWF JOYCALSTEP ;1 TO 8, CHECKS THE 4 AXIS DEFINITION POINTS MAX RTCFMAX,MIN,RTCFMN ;WE DO THIS 4 TIMES, A TOTAL OF 4 FOR EACH AXIS BCF JOYCALPASS ;0=FIRST PASS 1=SECOND PASS BSF JOYCALINIT ;set flag after first pass CLRF JOYDIRDETECT ;HOLDS THE AXIS FOUND ON FIRST PASS, AND SUBSEQUENT PASSES. CLRF JOYREADCOUNTER ;COUNTS EACH DATA ACQUISITION STARTJOYCAL INCF JOYCALDELAY ;TO SLOW DOWN THE OPERATION OF THIS ROUTINE, WE USE A COUNTER MOVLW JOYCALWAIT ;GET COUNT TO ENTER CPFSGT JOYCALDELAY ;HAS ENOUGH TIME PASSED? RETURN CLRF JOYCALDELAY ;CLEAR THE COUNTER SO IT IS READY FOR THE NEXT ENTRY DELAY MOVLW D'1' ;FIRST STEP IF JOYCALSTEP=1 CPFSEQ JOYCALSTEP ;SETS DIRECTION OF ASSIST GOTO JOYSTEP2 MOVLW B'00000001' ;ASSIST DIRECTION CAL MOVWF AMPPORT MOVWF AMPMASK BCF JOYCKAXIS ;DONT CK AXIS BSF JOYCAL1OR5 ;STEP 1 SET SO WE DEFINE DIRECTION1 BTFSC JOYCALPASS ;CHECK FOR SECOND PASS(SET) CALL GETDIRASSIST GETASTICK CALL CHECKSTICK MOVLW D'3' CPFSGT JOYREADCOUNTER ;HAVE WE READ THIS VALUE 4 TIMES? RETURN ;NOPE MOVLW B'11111111' ; ACQUISITION COMPLETE TURN THEM ALL ON MOVWF AMPPORT BTFSC JOYCALPASS ;CHECK FOR SECOND PASS(will be SET) GOTO FIN1 ;SKIP JOYCONFIG DETERMINATION ON SECOND PASS BTFSC FIRJOYDIRXH ;CHECK THE DIR BITS GOTO AWASXHI ;SET FOR CORRECT ORIENTATION BTFSC FIRJOYDIRXL GOTO AWASXLO BTFSC FIRJOYDIRYH GOTO AWASYHI BTFSC FIRJOYDIRYL GOTO AWASYLO FIN1 CLRF JOYREADCOUNTER INCF JOYCALSTEP ;SET UP FOR NEXT STEP RETURN GETDIRASSIST CLRF JOYDIRDETECT ;CLEAR DETECT VARIABLE( CLRF TMP3 ;WILL HOLD AXIS DIR FOR NEXT MOVE BTFSC JOYXYSELECT ;IS JOYSTICKAXIS SWAPPED?(SET= SWAPPED) GOTO AXISWASSWAPPED ;YES WAS SWAPPED BTFSC JOYXINVERT ;AXIS NOT SWAPPED GOTO XINVERTED1 BSF FIRJOYDIRXL ;STANDARD CONFIG BSF TMP3,4 ;NEXT AXIS WILL BE XH RETURN AXISWASSWAPPED BTFSC JOYYINVERT ;AXIS SWAPPED CK YINV GOTO YINVERT1 BSF FIRJOYDIRYL ;NOT INVERTED BSF TMP3,6 ;NEXT AXIS WILL BE YH RETURN YINVERT1 BSF FIRJOYDIRYH ;INVERTED BSF TMP3,7 ;NEXT AXIS WILL BE YL RETURN XINVERTED1 BSF FIRJOYDIRXH ;X WAS INVERTED BSF TMP3,5 ;NEXT AXIS WILL BE XL RETURN AWASXHI BCF JOYXYSELECT ;SETS UP THE JOY CONFIG BITS ASSIST AXIS BSF JOYXINVERT BCF JOYFIRSTAXIS GOTO FIN1 AWASXLO BCF JOYXYSELECT BCF JOYXINVERT BCF JOYFIRSTAXIS GOTO FIN1 AWASYHI BSF JOYXYSELECT BSF JOYYINVERT BSF JOYFIRSTAXIS GOTO FIN1 AWASYLO BSF JOYXYSELECT BCF JOYYINVERT BSF JOYFIRSTAXIS GOTO FIN1 JOYSTEP2 MOVLW D'2' CPFSEQ JOYCALSTEP ;SETS RETURN TO CENTER FROM ASSIST GOTO JOYSTEP3 MOVLW B'00001000' MOVWF AMPPORT MOVWF AMPMASK BCF JOYCKAXIS BCF JOYCAL1OR5 ;STEP 2 CLEAR SO WE WATCH DIRECTION CALL CHECKMID MOVLW D'3' CPFSGT JOYREADCOUNTER ;HAVE WE READ THIS VALUE 4 TIMES? RETURN ;NOPE MOVLW B'11111111' ;TURN THEM ALL ON MOVWF AMPPORT CLRF JOYREADCOUNTER INCF JOYCALSTEP ;SET UP FOR NEXT STEP RETURN JOYSTEP3 MOVLW D'3' CPFSEQ JOYCALSTEP ;SETS CHARGE DIRECTION GOTO JOYSTEP4 MOVLW B'10000000' MOVWF AMPPORT MOVWF AMPMASK BCF JOYCKAXIS CALL GETDIRASSIST BCF JOYCAL1OR5 ;STEP 3 CLEAR SO WE WATCH DIRECTION MOVFF TMP3,JOYDIRDETECT ;FIX DIR FOR THIS STEP GETASTICK2 CALL CHECKSTICK MOVLW D'3' CPFSGT JOYREADCOUNTER ;HAVE WE READ THIS VALUE 4 TIMES? RETURN ;NOPE MOVLW B'11111111' ;TURN THEM ALL ON MOVWF AMPPORT CLRF JOYREADCOUNTER INCF JOYCALSTEP ;SET UP FOR NEXT STEP RETURN JOYSTEP4 MOVLW D'4' CPFSEQ JOYCALSTEP GOTO JOYSTEP5 MOVLW B'00010000' MOVWF AMPPORT MOVWF AMPMASK BCF JOYCKAXIS BCF JOYCAL1OR5 ;STEP 4 CLEAR SO WE WATCH DIRECTION CALL CHECKMID MOVLW D'3' CPFSGT JOYREADCOUNTER ;HAVE WE READ THIS VALUE 4 TIMES? RETURN ;NOPE MOVLW B'11111111' ;TURN THEM ALL ON MOVWF AMPPORT CLRF JOYREADCOUNTER INCF JOYCALSTEP ;SET UP FOR NEXT STEP CLRF JOYDIRDETECT RETURN JOYSTEP5 MOVLW D'5' ;FIRST STEP IF JOYCALSTEP=1 CPFSEQ JOYCALSTEP ;SETS DIRECTION OF JOGUP GOTO JOYSTEP6 MOVLW B'00000001' MOVWF AMPPORT MOVWF AMPMASK BSF JOYCKAXIS ;ENABLES CHECKING IF THIS IS THE CORRECT SECOND AXIS SO WE DONT DO 2 X OR Y BTG MODE3LED BSF JOYCAL1OR5 ;STEP 5 SET SO WE DEFINE DIRECTION BTFSC JOYCALPASS CALL GETDIRJOGUP GETJSTICK CALL CHECKSTICK MOVLW D'3' CPFSGT JOYREADCOUNTER ;HAVE WE READ THIS VALUE 4 TIMES? RETURN ;NOPE MOVLW B'11111111' ;TURN THEM ALL ON MOVWF AMPPORT BTFSC JOYCALPASS ;CHECK FOR SECOND PASS(SET) GOTO JFIN2 ;SKIP JOYCONFIG DETERMINATION ON SECOND PASS BTFSC FIRJOYDIRXH ;CHECK THE DIR BITSFOR Y AXIS GOTO CWASXHI BTFSC FIRJOYDIRXL GOTO CWASXLO BTFSC FIRJOYDIRYH GOTO CWASYHI BTFSC FIRJOYDIRYL GOTO CWASYLO JFIN2 CLRF JOYREADCOUNTER INCF JOYCALSTEP ;SET UP FOR NEXT STEP RETURN GETDIRJOGUP CLRF JOYDIRDETECT ;CLEAR DETECT VARIABLE CLRF TMP3 BTFSC JOYXYSELECT ;IS JOYSTICKAXIS SWAPPED?(SET= SWAPPED) GOTO AXISWASSWAPPED1 ;YES WAS SWAPPED BTFSC JOYYINVERT ;AXIS NOT SWAPPED GOTO YINVERTED1 BSF FIRJOYDIRYL ;STANDARD CONFIG BSF TMP3,6 RETURN AXISWASSWAPPED1 BTFSC JOYXINVERT ;AXIS SWAPPED CK YINV GOTO XINVERT1 BSF FIRJOYDIRXL ;NOT INVERTED BSF TMP3,4 RETURN XINVERT1 BSF FIRJOYDIRXH ;INVERTED BSF TMP3,5 GOTO GETJSTICK YINVERTED1 BSF FIRJOYDIRYH ;Y WAS INVERTED BSF TMP3,7 RETURN CWASXHI BSF JOYXYSELECT ;SETS UP THE YJOY CONFIG BITS CHARGE AXIS BSF JOYXINVERT GOTO JFIN2 CWASXLO BSF JOYXYSELECT BCF JOYXINVERT GOTO JFIN2 CWASYHI BCF JOYXYSELECT BSF JOYYINVERT GOTO JFIN2 CWASYLO BCF JOYXYSELECT BCF JOYYINVERT GOTO JFIN2 JOYSTEP6 MOVLW D'6' CPFSEQ JOYCALSTEP ;SETS RETURN TO CENTER FROM JOGUP GOTO JOYSTEP7 MOVLW B'00001000' MOVWF AMPPORT MOVWF AMPMASK BCF JOYCKAXIS BTG MODE3LED BCF JOYCAL1OR5 ;STEP 6 CLEAR SO WE WATCH DIRECTION CALL CHECKMID MOVLW D'3' CPFSGT JOYREADCOUNTER ;HAVE WE READ THIS VALUE 4 TIMES? RETURN ;NOPE MOVLW B'11111111' ;TURN THEM ALL ON MOVWF AMPPORT CLRF JOYREADCOUNTER INCF JOYCALSTEP ;SET UP FOR NEXT STEP RETURN JOYSTEP7 MOVLW D'7' CPFSEQ JOYCALSTEP ;SETS DIRECTION OF JOGDOWN GOTO JOYSTEP8 MOVLW B'10000000' MOVWF AMPPORT MOVWF AMPMASK BCF JOYCKAXIS CALL GETDIRJOGUP BTG MODE3LED BCF JOYCAL1OR5 ;STEP 7 CLEAR SO WE WATCH DIRECTION MOVFF TMP3,JOYDIRDETECT ;FIX DIR FOR THIS STEP CALL CHECKSTICK MOVLW D'3' CPFSGT JOYREADCOUNTER ;HAVE WE READ THIS VALUE 4 TIMES? RETURN ;NOPE MOVLW B'11111111' ;TURN THEM ALL ON MOVWF AMPPORT CLRF JOYREADCOUNTER INCF JOYCALSTEP ;SET UP FOR NEXT STEP RETURN JOYSTEP8 MOVLW D'8' CPFSEQ JOYCALSTEP GOTO JOYSTEPDONE ;SETS RETURN TO CENTER FROM JOGDOWN MOVLW B'00010000' MOVWF AMPPORT MOVWF AMPMASK BCF JOYCKAXIS BTG MODE3LED BCF JOYCAL1OR5 ;STEP 8 CLEAR SO WE WATCH DIRECTION CALL CHECKMID MOVLW D'3' CPFSGT JOYREADCOUNTER ;HAVE WE READ THIS VALUE 4 TIMES? RETURN ;NOPE MOVLW B'11111111' ;TURN THEM ALL ON MOVWF AMPPORT CLRF JOYREADCOUNTER INCF JOYCALSTEP ;SET UP FOR NEXT STEP RETURN JOYSTEPDONE MOVLW D'1' MOVWF JOYCALSTEP ;RESET THE STEP COUNTER TO 1 BTFSC JOYCALPASS ;IF ALREADY SET WE ARE DONE GOTO JOYCALDONE BSF JOYCALPASS ; NEXT CAL PASS MOVFF JOYXMAXH,TJOYXMAXH ;SAVE ALL THE LAST VALUES MOVFF JOYXMAXL,TJOYXMAXL MOVFF JOYXRFMXH,TJOYXRFMXH MOVFF JOYXRFMXL,TJOYXRFMXL MOVFF JOYXMINH,TJOYXMINH MOVFF JOYXMINL,TJOYXMINL MOVFF JOYXRFMNH,TJOYXRFMNH MOVFF JOYXRFMNL,TJOYXRFMNL MOVFF JOYYMAXH,TJOYYMAXH MOVFF JOYYMAXL,TJOYYMAXL MOVFF JOYYRFMXH,TJOYYRFMXH MOVFF JOYYRFMXL,TJOYYRFMXL MOVFF JOYYMINH,TJOYYMINH MOVFF JOYYMINL,TJOYYMINL MOVFF JOYYRFMNH,TJOYYRFMNH MOVFF JOYYRFMNL,TJOYYRFMNL BSF MODE3LED ;MAKE SURE THE MODE 3 LED IS ON. RETURN JOYCALDONE MOVFF JOYXMAXH,ACCBHI ;DETERMINE MIN OF TWO MOVFF JOYXMAXL,ACCBLO MOVFF TJOYXMAXH,ACCAHI MOVFF TJOYXMAXL,ACCALO CALL DOUBLESUB BTFSC STATUS,N GOTO WASNEG1 MOVFF TJOYXMAXH,MYEEDATA ;SAVE SMALLER MOVLW D'9' MOVWF EEADDRESS CALL WRITEDATA MOVFF TJOYXMAXL,MYEEDATA MOVLW D'10' MOVWF EEADDRESS CALL WRITEDATA GOTO SAVENEXT1 WASNEG1 MOVFF JOYXMAXH,MYEEDATA ;SAVE SMALLER MOVLW D'9' MOVWF EEADDRESS CALL WRITEDATA MOVFF JOYXMAXL,MYEEDATA MOVLW D'10' MOVWF EEADDRESS CALL WRITEDATA SAVENEXT1 MOVFF TJOYXRFMXH,ACCBHI ;DETERMINE MAX OF TWO MOVFF TJOYXRFMXL,ACCBLO MOVFF JOYXRFMXH,ACCAHI MOVFF JOYXRFMXL,ACCALO CALL DOUBLESUB BTFSC STATUS,N GOTO WASNEG2 MOVFF TJOYXRFMXH,MYEEDATA ;SAVE LARGER MOVLW D'11' MOVWF EEADDRESS CALL WRITEDATA MOVFF TJOYXRFMXL,MYEEDATA MOVLW D'12' MOVWF EEADDRESS CALL WRITEDATA GOTO SAVENEXT2 WASNEG2 MOVFF JOYXRFMXH,MYEEDATA ;SAVE LARGER MOVLW D'11' MOVWF EEADDRESS CALL WRITEDATA MOVFF JOYXRFMXL,MYEEDATA MOVLW D'12' MOVWF EEADDRESS CALL WRITEDATA SAVENEXT2 MOVFF TJOYXMINH,ACCBHI ;DETERMINE LARGER OF TWO MOVFF TJOYXMINL,ACCBLO MOVFF JOYXMINH,ACCAHI MOVFF JOYXMINL,ACCALO CALL DOUBLESUB BTFSC STATUS,N GOTO WASNEG3 MOVFF TJOYXMINH,MYEEDATA ;SAVE LARGER MOVLW D'13' MOVWF EEADDRESS CALL WRITEDATA MOVFF TJOYXMINL,MYEEDATA MOVLW D'14' MOVWF EEADDRESS CALL WRITEDATA GOTO SAVENEXT3 WASNEG3 MOVFF JOYXMINH,MYEEDATA ;SAVE LARGER MOVLW D'13' MOVWF EEADDRESS CALL WRITEDATA MOVFF JOYXMINL,MYEEDATA MOVLW D'14' MOVWF EEADDRESS CALL WRITEDATA SAVENEXT3 MOVFF JOYXRFMNH,ACCBHI ;DETERMINE MIN OF TWO MOVFF JOYXRFMNL,ACCBLO MOVFF TJOYXRFMNH,ACCAHI MOVFF TJOYXRFMNL,ACCALO CALL DOUBLESUB BTFSC STATUS,N GOTO WASNEG4 MOVFF TJOYXRFMNH,MYEEDATA ;SAVE SMALLER MOVLW D'15' MOVWF EEADDRESS CALL WRITEDATA MOVFF TJOYXRFMNL,MYEEDATA MOVLW D'16' MOVWF EEADDRESS CALL WRITEDATA GOTO SAVENEXT4 WASNEG4 MOVFF JOYXRFMNH,MYEEDATA ;SAVE SMALLER MOVLW D'15' MOVWF EEADDRESS CALL WRITEDATA MOVFF JOYXRFMNL,MYEEDATA MOVLW D'16' MOVWF EEADDRESS CALL WRITEDATA SAVENEXT4 MOVFF JOYYMAXH,ACCBHI ;DETERMINE MIN OF TWO MOVFF JOYYMAXL,ACCBLO MOVFF TJOYYMAXH,ACCAHI MOVFF TJOYYMAXL,ACCALO CALL DOUBLESUB BTFSC STATUS,N GOTO WASNEG5 MOVFF TJOYYMAXH,MYEEDATA ;SAVE SMALLER MOVLW D'17' MOVWF EEADDRESS CALL WRITEDATA MOVFF TJOYYMAXL,MYEEDATA MOVLW D'18' MOVWF EEADDRESS CALL WRITEDATA GOTO SAVENEXT5 WASNEG5 MOVFF JOYYMAXH,MYEEDATA ;SAVE SMALLER MOVLW D'17' MOVWF EEADDRESS CALL WRITEDATA MOVFF JOYYMAXL,MYEEDATA MOVLW D'18' MOVWF EEADDRESS CALL WRITEDATA SAVENEXT5 MOVFF TJOYYRFMXH,ACCBHI ;DETERMINE MAX OF TWO MOVFF TJOYYRFMXL,ACCBLO MOVFF JOYYRFMXH,ACCAHI MOVFF JOYYRFMXL,ACCALO CALL DOUBLESUB BTFSC STATUS,N GOTO WASNEG6 MOVFF TJOYYRFMXH,MYEEDATA ;SAVE LARGER MOVLW D'19' MOVWF EEADDRESS CALL WRITEDATA MOVFF TJOYYRFMXL,MYEEDATA MOVLW D'20' MOVWF EEADDRESS CALL WRITEDATA GOTO SAVENEXT6 WASNEG6 MOVFF JOYYRFMXH,MYEEDATA ;SAVE LARGER MOVLW D'19' MOVWF EEADDRESS CALL WRITEDATA MOVFF JOYYRFMXL,MYEEDATA MOVLW D'20' MOVWF EEADDRESS CALL WRITEDATA SAVENEXT6 MOVFF TJOYYMINH,ACCBHI ;DETERMINE LARGER OF TWO MOVFF TJOYYMINL,ACCBLO MOVFF JOYYMINH,ACCAHI MOVFF JOYYMINL,ACCALO CALL DOUBLESUB BTFSC STATUS,N GOTO WASNEG7 MOVFF TJOYYMINH,MYEEDATA ;SAVE LARGER MOVLW D'21' MOVWF EEADDRESS CALL WRITEDATA MOVFF TJOYYMINL,MYEEDATA MOVLW D'22' MOVWF EEADDRESS CALL WRITEDATA GOTO SAVENEXT7 WASNEG7 MOVFF JOYYMINH,MYEEDATA ;SAVE LARGER MOVLW D'21' MOVWF EEADDRESS CALL WRITEDATA MOVFF JOYYMINL,MYEEDATA MOVLW D'22' MOVWF EEADDRESS CALL WRITEDATA SAVENEXT7 MOVFF JOYYRFMNH,ACCBHI ;DETERMINE MIN OF TWO MOVFF JOYYRFMNL,ACCBLO MOVFF TJOYYRFMNH,ACCAHI MOVFF TJOYYRFMNL,ACCALO CALL DOUBLESUB BTFSC STATUS,N GOTO WASNEG8 MOVFF TJOYYRFMNH,MYEEDATA ;SAVE SMALLER MOVLW D'23' MOVWF EEADDRESS CALL WRITEDATA MOVFF TJOYYRFMNL,MYEEDATA MOVLW D'24' MOVWF EEADDRESS CALL WRITEDATA GOTO SAVENEXT8 WASNEG8 MOVFF JOYYRFMNH,MYEEDATA ;SAVE SMALLER MOVLW D'23' MOVWF EEADDRESS CALL WRITEDATA MOVFF JOYYRFMNL,MYEEDATA MOVLW D'24' MOVWF EEADDRESS CALL WRITEDATA SAVENEXT8 MOVLW B'00001110' ANDWF JOYCONFIG,F ;STRIP OUT ONLY JOYSTICK BITS MOVFF JOYCONFIG,MYEEDATA MOVLW D'8' MOVWF EEADDRESS CALL WRITEDATA BCF JOYCALINIT ;CLEAR INIT FLAG BCF JOYCALMODE ;CAL FINISHED BCF BLANKIT BCF MODE3LED CALL INIT RETURN ;**************************************************************** ;DETERMINES WHICH DIRECTION THE JOYSTICK HAS MOVED, OR IF IT HAS NOT MOVED ;RETURNS WITH JOYDIRDETECT BIT SET FOR THE DETECTED MOTION ;IT COUNTS HOW MANY TIMES IT HAS BEEN ACCESSED, COMPARES IF SAME ;ALSO SAVES THE READING ;ON STEP 1 AND 5 WHERE THE INITIAL DIRECTION IS UNKNOWN, WE SET BASED JOYDIRDETECT BASED ;ON WHAT WE FIND ON THE REMAINDER OF THE STEPS WE CHECK TO CONFIRM IF THE MOTION IS IN THE ;CORECT DIRECTION. ;**************************************************************** CHECKSTICK MOVLW D'3' ;MAX STICK WILL READ 3 IN HI BYTE, AND 0 IN THE HI BYTE WHEN AT MIN. IN CENTER HIGH BYTE WILL BE 1 OR 2 CPFSEQ JOYXH ;CK X STICK FOR MAX GOTO CKOUTY ;NO MATCH BTFSS JOYCKAXIS ;0=DONT CHECK 1=CK GOTO XWASHI BTFSC JOYFIRSTAXIS ;0=X WAS FIRST, 1= Y WAS FIRST GOTO XWASHI GOTO WRONGWAY CKOUTY CPFSEQ JOYYH ;TEST FOR JOYTICK Y HI GOTO TEST4LO BTFSS JOYCKAXIS ;0=DONT CHECK 1=CK GOTO YWASHI BTFSS JOYFIRSTAXIS ;0=X WAS FIRST, 1= Y WAS FIRST GOTO YWASHI GOTO WRONGWAY TEST4LO TSTFSZ JOYXH ;TEST FOR ZERO IN HI BYTE OR MIN GOTO TESTY4LO ;TEST FOR X AXIS LOW DIRECTION BTFSS JOYCKAXIS ;0=DONT CHECK 1=CK GOTO XWASLO BTFSC JOYFIRSTAXIS ;0=X WAS FIRST, 1= Y WAS FIRST GOTO XWASLO GOTO WRONGWAY TESTY4LO TSTFSZ JOYYH ;TEST FOR ZERO IN HI BYTE OR MIN GOTO JINMIDDLE BTFSS JOYCKAXIS ;0=DONT CHECK 1=CK GOTO YWASLO BTFSS JOYFIRSTAXIS ;0=X WAS FIRST, 1= Y WAS FIRST GOTO YWASLO GOTO WRONGWAY XWASHI BTFSC JOYCALPASS ;CHECK FOR SECOND PASS(SET)ALWAYS CHECK FOR DIR OF MOVE IN SECOND PASS GOTO XHINEXT ;IF SECOND PASS DO THIS TSTFSZ JOYREADCOUNTER ;IS THIS FIRST PASS THIS STEP? GOTO XHINEXT MOVFF JOYXH,JOYXMAXH ;MAX VALUE FOR X JOYSTICKH SAVE THE VALUE MOVFF JOYXL,JOYXMAXL ;MAX VALUE FOR X JOYSTICKX INCF JOYREADCOUNTER BTFSS JOYCAL1OR5 ; DONT SET EXCEPT FOR STEP 1 AND 5 FIRST PASS RETURN CLRF JOYDIRDETECT BSF JOYDIRXH ;SET BIT DIRETION BIT BSF FIRJOYDIRXH ;SET FIRST DIRECTION BIT RETURN XHINEXT BTFSS FIRJOYDIRXH ;IS THIS THE CORRECT DIRECTION GOTO WRONGWAY ;NOPE FLASH ERROR RETURN MOVFF JOYXH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYXL,ACCBLO MOVFF JOYXMAXH,ACCAHI MOVFF JOYXMAXL,ACCALO CALL DOUBLESUB BTFSS STATUS,N GOTO TESTXH CALL NEG_B ;CONVERT TO POSITIVE NUMBER TESTXH TSTFSZ ACCBHI ;IF HI REG IS NOT 0 THERE IS NO MATCH GOTO JOYXHNOMATCH MOVLW JOYMATCHVAL ;CK IF NEW VALUE IS THE SAME AS OLD +-THE JOYMATCHVAL CPFSLT ACCBLO GOTO JOYXHNOMATCH INCF JOYREADCOUNTER ;WAS THE SAME RETURN JOYXHNOMATCH CLRF JOYREADCOUNTER ;NO MATCH MOVFF JOYXH,JOYXMAXH ;SAVE LATEST VALUE MOVFF JOYXL,JOYXMAXL RETURN YWASHI BTFSC JOYCALPASS ;CHECK FOR SECOND PASS(SET) GOTO YHINEXT TSTFSZ JOYREADCOUNTER ;IS THIS FIRST PASS? GOTO YHINEXT MOVFF JOYYH,JOYYMAXH ;MAX VALUE FOR X JOYSTICKH MOVFF JOYYL,JOYYMAXL ;MAX VALUE FOR X JOYSTICKX INCF JOYREADCOUNTER BTFSS JOYCAL1OR5 ; DONT SET EXCEPT FOR STEP 1 AND 5 FIRST PASS RETURN CLRF JOYDIRDETECT BSF JOYDIRYH ;SET BIT DIRETION BIT BSF FIRJOYDIRYH ;SET FIRST DIRECTION BIT RETURN YHINEXT BTFSS FIRJOYDIRYH ;IS THIS THE CORRECT DIRECTION GOTO WRONGWAY ;NOPE FLASH ERROR RETURN MOVFF JOYYH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYYL,ACCBLO MOVFF JOYYMAXH,ACCAHI MOVFF JOYYMAXL,ACCALO CALL DOUBLESUB BTFSS STATUS,N GOTO TESTYH CALL NEG_B ;CONVERT TO POSITIVE NUMBER TESTYH TSTFSZ ACCBHI ;IF HI REG IS NOT 0 THERE IS NO MATCH GOTO JOYYHNOMATCH MOVLW JOYMATCHVAL ;CK IF NEW VALUE IS THE SAME AS OLD +-THE JOYMATCHVAL CPFSLT ACCBLO GOTO JOYYHNOMATCH INCF JOYREADCOUNTER ;WAS THE SAME RETURN JOYYHNOMATCH CLRF JOYREADCOUNTER ;NO MATCH MOVFF JOYYH,JOYYMAXH ;SAVE LATEST VALUE MOVFF JOYYL,JOYYMAXL RETURN XWASLO BTFSC JOYCALPASS ;CHECK FOR SECOND PASS(SET) GOTO XLONEXT TSTFSZ JOYREADCOUNTER ;IS THIS FIRST PASS? GOTO XLONEXT MOVFF JOYXH,JOYXMINH ;MAX VALUE FOR X JOYSTICKH MOVFF JOYXL,JOYXMINL ;MAX VALUE FOR X JOYSTICKX INCF JOYREADCOUNTER BTFSS JOYCAL1OR5 ; DONT SET EXCEPT FOR STEP 1 AND 5 FIRST PASS RETURN CLRF JOYDIRDETECT BSF JOYDIRXL ;SET BIT DIRETION BIT BSF FIRJOYDIRXL ;SET FIRST DIRECTION BIT RETURN XLONEXT BTFSS FIRJOYDIRXL ;IS THIS THE CORRECT DIRECTION GOTO WRONGWAY ;NOPE FLASH ERROR RETURN MOVFF JOYXH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYXL,ACCBLO MOVFF JOYXMINH,ACCAHI MOVFF JOYXMINL,ACCALO CALL DOUBLESUB BTFSS STATUS,N GOTO TESTXL CALL NEG_B ;CONVERT TO POSITIVE NUMBER TESTXL TSTFSZ ACCBHI ;IF HI REG IS NOT 0 THERE IS NO MATCH GOTO JOYXLNOMATCH MOVLW JOYMATCHVAL ;CK IF NEW VALUE IS THE SAME AS OLD +-THE JOYMATCHVAL CPFSLT ACCBLO GOTO JOYXLNOMATCH INCF JOYREADCOUNTER ;WAS THE SAME RETURN JOYXLNOMATCH CLRF JOYREADCOUNTER ;NO MATCH MOVFF JOYXH,JOYXMINH ;SAVE LATEST VALUE MOVFF JOYXL,JOYXMINL RETURN YWASLO BTFSC JOYCALPASS ;CHECK FOR SECOND PASS(SET) GOTO YLONEXT TSTFSZ JOYREADCOUNTER ;IS THIS FIRST PASS? GOTO YLONEXT MOVFF JOYYH,JOYYMINH ;MAX VALUE FOR X JOYSTICKH MOVFF JOYYL,JOYYMINL ;MAX VALUE FOR X JOYSTICKX INCF JOYREADCOUNTER BTFSS JOYCAL1OR5 ; DONT SET EXCEPT FOR STEP 1 AND 5 FIRST PASS RETURN CLRF JOYDIRDETECT BSF JOYDIRYL ;SET BIT DIRETION BIT BSF FIRJOYDIRYL ;SET FIRST DIRECTION BIT RETURN YLONEXT BTFSS FIRJOYDIRYL ;IS THIS THE CORRECT DIRECTION GOTO WRONGWAY ;NOPE FLASH ERROR RETURN MOVFF JOYYH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYYL,ACCBLO MOVFF JOYYMINH,ACCAHI MOVFF JOYYMINL,ACCALO CALL DOUBLESUB BTFSS STATUS,N GOTO TESTYL CALL NEG_B ;CONVERT TO POSITIVE NUMBER TESTYL TSTFSZ ACCBHI ;IF HI REG IS NOT 0 THERE IS NO MATCH GOTO JOYYLNOMATCH MOVLW JOYMATCHVAL ;CK IF NEW VALUE IS THE SAME AS OLD +-THE JOYMATCHVAL CPFSLT ACCBLO GOTO JOYYLNOMATCH INCF JOYREADCOUNTER ;WAS THE SAME RETURN JOYYLNOMATCH CLRF JOYREADCOUNTER ;NO MATCH MOVFF JOYYH,JOYYMINH ;SAVE LATEST VALUE MOVFF JOYYL,JOYYMINL RETURN WRONGWAY MOVLW B'10100101' ;FLASH WRONG WAy pattern MOVWF AMPPORT RETURN JINMIDDLE RETURN ;********************************************************************** ;CHECKS THE MID VALUES ;********************************************************************** CHECKMID BTFSC FIRJOYDIRXH ;JUMP TO CORRECT PROGRAM GOTO RFXH BTFSC FIRJOYDIRXL GOTO RFXL BTFSC FIRJOYDIRYH GOTO RFYH BTFSC FIRJOYDIRYL GOTO RFYL RETURN RFXH MOVFF JOYXH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYXL,ACCBLO MOVLW H'1' MOVWF ACCAHI MOVLW H'80' MOVWF ACCALO CALL DOUBLESUB BTFSC STATUS,N RETURN MOVFF JOYXH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYXL,ACCBLO MOVLW H'2' MOVWF ACCAHI MOVLW H'64' MOVWF ACCALO CALL DOUBLESUB BTFSS STATUS,N RETURN TSTFSZ JOYREADCOUNTER ;IS THIS FIRST PASS? GOTO XMXHNEXT MOVFF JOYXH,JOYXRFMXH ;SAVE LATEST VALUE MOVFF JOYXL,JOYXRFMXL INCF JOYREADCOUNTER ;WAS THE SAME RETURN XMXHNEXT MOVFF JOYXH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYXL,ACCBLO MOVFF JOYXRFMXH,ACCAHI MOVFF JOYXRFMXL,ACCALO CALL DOUBLESUB BTFSS STATUS,N GOTO MTESTRXH CALL NEG_B ;CONVERT TO POSITIVE NUMBER MTESTRXH TSTFSZ ACCBHI ;IF HI REG IS NOT 0 THERE IS NO MATCH GOTO JOYMXHNOMATCH MOVLW JOYMATCHVAL ;CK IF NEW VALUE IS THE SAME AS OLD +-THE JOYMATCHVAL CPFSLT ACCBLO GOTO JOYMXHNOMATCH INCF JOYREADCOUNTER ;WAS THE SAME RETURN JOYMXHNOMATCH CLRF JOYREADCOUNTER ;NO MATCH MOVFF JOYXH,JOYXRFMXH ;SAVE LATEST VALUE MOVFF JOYXL,JOYXRFMXL RETURN RFXL MOVFF JOYXH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYXL,ACCBLO MOVLW H'1' MOVWF ACCAHI MOVLW H'80' MOVWF ACCALO CALL DOUBLESUB BTFSC STATUS,N RETURN MOVFF JOYXH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYXL,ACCBLO MOVLW H'2' MOVWF ACCAHI MOVLW H'64' MOVWF ACCALO CALL DOUBLESUB BTFSS STATUS,N RETURN TSTFSZ JOYREADCOUNTER ;IS THIS FIRST PASS? GOTO XMXLNEXT MOVFF JOYXH,JOYXRFMNH ;SAVE LATEST VALUE MOVFF JOYXL,JOYXRFMNL INCF JOYREADCOUNTER ;WAS THE SAME RETURN XMXLNEXT MOVFF JOYXH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYXL,ACCBLO MOVFF JOYXRFMNH,ACCAHI MOVFF JOYXRFMNL,ACCALO CALL DOUBLESUB BTFSS STATUS,N GOTO MTESTRXL CALL NEG_B ;CONVERT TO POSITIVE NUMBER MTESTRXL TSTFSZ ACCBHI ;IF HI REG IS NOT 0 THERE IS NO MATCH GOTO JOYMXLNOMATCH MOVLW JOYMATCHVAL ;CK IF NEW VALUE IS THE SAME AS OLD +-THE JOYMATCHVAL CPFSLT ACCBLO GOTO JOYMXLNOMATCH INCF JOYREADCOUNTER ;WAS THE SAME RETURN JOYMXLNOMATCH CLRF JOYREADCOUNTER ;NO MATCH MOVFF JOYXH,JOYXRFMNH ;SAVE LATEST VALUE MOVFF JOYXL,JOYXRFMNL RETURN RFYH MOVFF JOYYH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYYL,ACCBLO MOVLW H'1' MOVWF ACCAHI MOVLW H'80' MOVWF ACCALO CALL DOUBLESUB BTFSC STATUS,N RETURN MOVFF JOYYH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYYL,ACCBLO MOVLW H'2' MOVWF ACCAHI MOVLW H'64' MOVWF ACCALO CALL DOUBLESUB BTFSS STATUS,N RETURN TSTFSZ JOYREADCOUNTER ;IS THIS FIRST PASS? GOTO YMYHNEXT MOVFF JOYYH,JOYYRFMXH ;SAVE LATEST VALUE MOVFF JOYYL,JOYYRFMXL INCF JOYREADCOUNTER ;WAS THE SAME RETURN YMYHNEXT MOVFF JOYYH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYYL,ACCBLO MOVFF JOYYRFMXH,ACCAHI MOVFF JOYYRFMXL,ACCALO CALL DOUBLESUB BTFSS STATUS,N GOTO MTESTRYH CALL NEG_B ;CONVERT TO POSITIVE NUMBER MTESTRYH TSTFSZ ACCBHI ;IF HI REG IS NOT 0 THERE IS NO MATCH GOTO JOYMYHNOMATCH MOVLW JOYMATCHVAL ;CK IF NEW VALUE IS THE SAME AS OLD +-THE JOYMATCHVAL CPFSLT ACCBLO GOTO JOYMYHNOMATCH INCF JOYREADCOUNTER ;WAS THE SAME RETURN JOYMYHNOMATCH CLRF JOYREADCOUNTER ;NO MATCH MOVFF JOYYH,JOYYRFMXH ;SAVE LATEST VALUE MOVFF JOYYL,JOYYRFMXL RETURN RFYL MOVFF JOYYH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYYL,ACCBLO MOVLW H'1' MOVWF ACCAHI MOVLW H'80' MOVWF ACCALO CALL DOUBLESUB BTFSC STATUS,N RETURN MOVFF JOYYH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYYL,ACCBLO MOVLW H'2' MOVWF ACCAHI MOVLW H'64' MOVWF ACCALO CALL DOUBLESUB BTFSS STATUS,N RETURN TSTFSZ JOYREADCOUNTER ;IS THIS FIRST PASS? GOTO YMYLNEXT MOVFF JOYYH,JOYYRFMNH ;SAVE LATEST VALUE MOVFF JOYYL,JOYYRFMNL INCF JOYREADCOUNTER ;WAS THE SAME RETURN YMYLNEXT MOVFF JOYYH,ACCBHI ;COMPARE NEW VALUE WITH LAST VALUE MOVFF JOYYL,ACCBLO MOVFF JOYYRFMNH,ACCAHI MOVFF JOYYRFMNL,ACCALO CALL DOUBLESUB BTFSS STATUS,N GOTO MTESTRYL CALL NEG_B ;CONVERT TO POSITIVE NUMBER MTESTRYL TSTFSZ ACCBHI ;IF HI REG IS NOT 0 THERE IS NO MATCH GOTO JOYMYLNOMATCH MOVLW JOYMATCHVAL ;CK IF NEW VALUE IS THE SAME AS OLD +-THE JOYMATCHVAL CPFSLT ACCBLO GOTO JOYMYLNOMATCH INCF JOYREADCOUNTER ;WAS THE SAME RETURN JOYMYLNOMATCH CLRF JOYREADCOUNTER ;NO MATCH MOVFF JOYYH,JOYYRFMNH ;SAVE LATEST VALUE MOVFF JOYYL,JOYYRFMNL RETURN ;********************************************************************** ;Put on or turn off the AR1 power transistor ; IF BATTERY AMPS >15A ;********************************************************************** POWEROUT BTFSS SWAPAR1 ;IF SWAPAR1 IS SET(BRAKE LIGHT >15A) DO ROUTINE RETURN ;WAS CLEAR SO SKIP ROUTINE MOVLW H'01' ;IS BAT AMPS <= D'349'= H'015D MOVWF ACCAHI MOVLW H'5D' MOVWF ACCALO MOVFF BAMPSH,ACCBHI MOVFF BAMPSL,ACCBLO CALL DOUBLESUB BTFSS STATUS,N GOTO TURNSTUFFOFF BTFSS AR1 ;SEE IF ALREADY ON BSF AR1 RETURN TURNSTUFFOFF BTFSC AR1 ;SEE IF ALREADY OFF BCF AR1 RETURN RETURN ;********************************************************************** ;GENERATES A RUNNING AVERAGE OF THE MAP SIGNAL FOR THE LAST(4 SAMPLES) ;********************************************************************** MAPAVE BTFSS MAPINIT ; CK IF MAP AVERAGE HAS BEEN INITIALIZED CALL DOMAPINIT MOVFF AVEMAPLO,ACCALO ;SUBTRACT THE AVERAGE MAP FROM THE ACCUMULATOR MOVFF AVEMAPHI,ACCAHI ; to make room for the new value MOVFF ACCMAPL0,ACCBLO MOVFF ACCMAPHI,ACCBHI CALL DOUBLESUB ;RESULT IS IN ACCBHI,ACCBLO MOVFF MAPLO,ACCALO ;ADD THE LAST MAP READING TO THE ACCUMULATOR MOVFF MAPHI,ACCAHI ;to make the average value move in the direction of the new reading CALL DOUBLEADD MOVFF ACCBLO,ACCMAPL0 ;PUT THE RESULT IN THE MAP ACCUMULATOR MOVFF ACCBHI,ACCMAPHI BCF STATUS,C ;DIVIDE THE ACCUMULATOR BY 4 RRCF ACCBHI ;/2 RRCF ACCBLO BCF STATUS,C RRCF ACCBHI ;/4 RRCF ACCBLO ; take the new average value and scale it MOVFF ACCBLO,AVEMAPLO ;further to bring the range of possible values MOVFF ACCBHI,AVEMAPHI ;into a smaller range MOVFF AVEMAPHI,ACCAHI MOVFF AVEMAPLO,ACCALO BCF STATUS,C RRCF ACCAHI ;/2 RRCF ACCALO BCF STATUS,C RRCF ACCAHI ;DIVIDE AVEMAP SIGNAL BY 4 RRCF ACCALO ;NOW MAX OF 150, MIN OF 25 MOVLW D'24' SUBWF ACCALO,F ;SUBTRACT OFFSET FROM MAP BTFSC STATUS,N ;IS RESULT NEGATIVE? GOTO FIXMINMAP MOVFF ACCALO,MAPSCALED ;MAP RANGE, 0=.5V, 27=1V, 76=2V, 117=2.8V RETURN FIXMINMAP CLRF MAPSCALED ;FORCE TO MINIMUM RETURN ;************************************************************************************ ;MAP AVERAGE INIT will initilize the accumulator with 4X the present map value ;************************************************************************************ DOMAPINIT MOVFF MAPLO,ACCALO MOVFF MAPHI,ACCAHI MOVFF MAPLO,AVEMAPLO MOVFF MAPHI,AVEMAPHI BCF STATUS,C RLCF ACCALO ;*2 RLCF ACCAHI BCF STATUS,C RLCF ACCALO ;*4 RLCF ACCAHI MOVFF ACCALO,ACCMAPL0 ;SAVE MAP AVERAGE *4 MOVFF ACCAHI,ACCMAPHI BSF MAPINIT ;SET INIT FLAG SO THIS ONLY HAPPENS ONCE RETURN ;********************************************************************** ;CHECKS mpi AND baTTERY TEMPS IF > 95 F TURN ON THE FANS ;********************************************************************** CHECKTHETEMPS MOVLW H'01' ; IS mpi TEMP > H O1 5C (~95f) MOVWF ACCBHI MOVLW H'5C' MOVWF ACCBLO BTFSC ALLFANS ; CHECKIF FANS ON CALL HYSTERCORRECT ;if on ads hysterysys so it will not cycle MOVFF MPITEMPH,ACCAHI MOVFF MPITEMPL,ACCALO CALL DOUBLESUB BTFSS STATUS,N GOTO TESTBATTEMP GOTO TURNFANSON TESTBATTEMP MOVLW H'01' ; IS BAT TEMP > D'389' (~95f) MOVWF ACCBHI MOVLW H'5C' MOVWF ACCBLO BTFSC ALLFANS ; CHECKIF FANS ON CALL HYSTERCORRECT MOVFF BTEMPH,ACCAHI MOVFF BTEMPL,ACCALO CALL DOUBLESUB BTFSS STATUS,N GOTO FANSOFF TURNFANSON BSF ALLFANS RETURN FANSOFF BCF ALLFANS RETURN ;********************************************************************** ;CORRECT ACCLO TO ENABLE HYSTERISIS only works with present temp setpoint ;********************************************************************** HYSTERCORRECT MOVLW TEMPHYSTER SUBWF ACCBLO,f RETURN ;********************************************************************** ;When in the Mima active (mode 1) mode, when the map is showing low load, the ;background charge will come on. This only works in mode 1. Jog the aux joystick left or right to adjust. ;charge is between 179=0 and 210=max in CMDPWRVALUE 0-25A ;********************************************************************** BACKGROUNDCH BTFSS BSPJOG GOTO BGTEST MOVLW D'90' MOVWF M1BLINKTIME CALL BLINKMODE1 BGTEST BTFSS BSPJOG BSF MODE1LED ;MAKE SURE IT IS ON(may have been blinking) BTFSS BGCHARGE ;ENABLES BACKGROUND CHARGE=1 RETURN BTFSC XINDEAD ;if joystick not in center skip setting of BGcharge RETURN MOVFF CHARGEBG,CMDPWRNEW ;SET BACKGROUND CHARGE TO SAVED VALUE RETURN ;********************************************************************** TOGGLEABCJOG BTFSS MODE1FLAG ;ONLY WORKS IN MODE RETURN BTFSS YJOGINMID ;IF SET WE ARE NOT IN Y JOG MIDDLE SO ALLOW TOGGLE RETURN DOTOGGLE BTG BSPJOG ;TOGGLES THE JOG FLAG FROM ABC CHARGE RATE TO ABC SETPOINT. RETURN ;********************************************************************** BGJOG MOVF ABCSETPOINT,W BCF BGCHARGE CPFSGT MAPSCALED BSF BGCHARGE ;if in BG map range, set flag BTFSS YJOGINMID ;CK IF Y STICK IN JOG MIDDLE (0) GOTO INBGMIDDLE ;BIT CLEAR SO IN MIDDLE NOTBGMIDDLE BSF EXPCHARGE ;ACTIVATES EXPANDED SCALE FOR REGEN BTFSC JOGB ;FLAG TO INDICATE JOG ACTION HAS BEEN DONE,WAIT FOR RTC BEFORE ALLOWING A SECOND JOG RETURN BSF JOGB BTFSC YMOVEDIR ;IF FLAG SET IS CHARGE GOTO BKREGENUP ;JOG regen VALUE DOWN GOTO BKREGENDN ;JOG regen VALUE UP INBGMIDDLE BCF JOGB BCF EXPCHARGE ;DEACTIVATES EXPANDED SCALE BCF BLANKIT BSF AMPPWM RETURN ;************************************************************************** BKREGENUP BTFSC SWAPABCSET ;CHECK TO SEE IF ABCSETPOINT OR ACB CHARGE RATE IS THE DEFAULT BTG BSPJOG ;INVERT BSPJOG TO MAKE SETPOINT DEFAULT BTFSC BSPJOG GOTO ABCSETUP INCF CHARGEBG,F ;INCREMENT BACKGROUND CHARGE BY 1 MOVLW D'210' ;CK IF TOO BIG(210 is about 25A) CPFSGT CHARGEBG GOTO SAVEBG4 MOVLW B'10100101' MOVWF AMPPORT ;LIGHT ERROR PATTERN BSF BLANKIT ;DISABLE AMPDISPLAY BCF AMPPWM ;DISABLE AMPPWM CLRF AMPMASK MOVLW D'210' ;IF TOO BIG FORCE TO MAX MOVWF CHARGEBG GOTO SAVEBG4 ABCSETUP MOVLW ABCJOGVALUE ADDWF ABCSETPOINT MOVLW D'117' CPFSLT ABCSETPOINT ;IF >MAX, FORCE TO MAX MOVWF ABCSETPOINT GOTO SAVEBBGSET ABCSETDN MOVLW ABCJOGVALUE SUBWF ABCSETPOINT BTFSC STATUS,N CLRF ABCSETPOINT GOTO SAVEBBGSET BKREGENDN BTFSC SWAPABCSET ;CHECK TO SEE IF ABCSETPOINT OR ACB CHARGE RATE IS THE DEFAULT BTG BSPJOG ;INVERT BSPJOG TO MAKE SETPOINT DEFAULT BTFSC BSPJOG GOTO ABCSETDN DECF CHARGEBG,F MOVLW D'179' ;CK IF TOO SMALL CPFSLT CHARGEBG GOTO SAVEBG4 MOVLW B'10100101' MOVWF AMPPORT ;LIGHT ERROR PATTERN BSF BLANKIT ;DISABLE AMPDISPLAY BCF AMPPWM ;DISABLE AMPPWM CLRF AMPMASK MOVLW D'179' ;IF TOO SMALL FORCE TO NEUTRAL MOVWF CHARGEBG SAVEBG4 MOVFF CHARGEBG,MYEEDATA MOVLW D'4' MOVWF EEADDRESS CALL WRITEDATA BTFSC SWAPABCSET ;CHECK SWAPFLAG IF SET TOGGL BIT BACK BTG BSPJOG ;INVERT BSPJOG PUT IT BACK TO NORMAL RETURN SAVEBBGSET MOVFF ABCSETPOINT,MYEEDATA MOVLW D'25' MOVWF EEADDRESS CALL WRITEDATA BTFSC SWAPABCSET ;CHECK SWAPFLAG IF SET TOGGL BIT BACK BTG BSPJOG ;INVERT BSPJOG PUT IT BACK TO NORMAL RETURN ;********************************************************************** ; MODIFYS CALIBRATE FUNCTIONS WITH JOG OF MAIN AND AUX JOYSTICKS ;First we must determinge if either of the joysticks has moved from center ;with big window so the x and y don't activate by mistake ;joystick up= less assist(assist setpointlarger) ;joystick down= more assist (assist setpoint smaller) ;joystick left=more regen (regen set point higher) ;joystick right=less regen (regen setpoint lower) ; ;********************************************************************* JOGCAL BTFSS XJOGINMID ;CK IF INTO THE ACTIVE JOG ZONE GOTO INAMIDDLE ;IF CLEAR GO TO MIDDLE BTFSS XMOVEDIR ;0=ASSIST 1=REGEN GOTO TESTAREGEN ;IF NO MOTION IN ASSIST DIR IS DETECTED, TEST REGEN DIRECTION BCF WASREGEN ;CLEARS FLAG TO INDICATE WAS ASSIST BTFSC SPCROSS GOTO NOTAMIDDLE MOVLW B'00000001' MOVWF AMPPORT ;LIGHT THE LAST AMBER LED BSF BLANKIT ;DISABLE AMPDISPLAY BCF AMPPWM ;DISABLE AMPPWM CLRF AMPMASK GOTO NOTAMIDDLE TESTAREGEN BSF WASREGEN ;SETS FLAG TO INDICATE REGEN BTFSC SPCROSS GOTO NOTAMIDDLE MOVLW B'00001000' MOVWF AMPPORT ;LIGHT THE LAST GREEN LED BSF BLANKIT BCF AMPPWM ;DISABLE AMPPWM CLRF AMPMASK NOTAMIDDLE BTFSC JOGA ;FLAG TO INDICATE JOYSTICK WAS MOVED RETURN BSF JOGA BTFSC WASREGEN ;IF FLAG SET IS ASSIST GOTO ASSISTUP ;JOG ASSIST VALUE UP GOTO ASSISTDN ;JOG ASSIST VALUR DOWN INAMIDDLE BCF JOGA AUXSTICK BTFSS YJOGINMID ;CK IF INTO THE ACTIVE JOG ZONE GOTO INRMIDDLE ;IF CLEAR GO TO MIDDLE BTFSS YMOVEDIR ;0=JOGUP 1=JOGDN GOTO TESTRREGEN ;IF NO MOTION IN ASSIST DIR IS DETECTED, TEST REGEN DIRECTION BCF WASREGEN ;CLEARS FLAG TO INDICATE WAS ASSIST BTFSC SPCROSS GOTO NOTRMIDDLE MOVLW B'10000000' MOVWF AMPPORT ;LIGHT THE LAST GREENLED BSF BLANKIT BCF AMPPWM ;DISABLE AMPPWM CLRF AMPMASK GOTO NOTRMIDDLE TESTRREGEN BSF WASREGEN ;SETS FLAG TO INDICATE REGEN BTFSC SPCROSS GOTO NOTRMIDDLE MOVLW B'00010000' MOVWF AMPPORT ;LIGHT THE LAST GREEN LED BSF BLANKIT BCF AMPPWM ;DISABLE AMPPWM CLRF AMPMASK NOTRMIDDLE BTFSC JOGB ;FLAG TO INDICATE JOYSTICK WAS MOVED RETURN BSF JOGB BTFSC WASREGEN ;IF FLAG SET IS ASSIST GOTO REGENDN ;JOG regen VALUE DOWN GOTO REGENUP ;JOG regen VALUE UP INRMIDDLE BCF JOGB BCF BLANKIT BCF SPCROSS RETURN ;********************************************************************** ;JOG CALIBRATE FUNCTIONS RAISE OR LOWER THE ASSIST AND REGEN SETPOINTS ;********************************************************************** ASSISTUP MOVLW JOGVALUE ADDWF ASETPOINT,F MOVLW D'116' ;CK IF TOO BIG CPFSGT ASETPOINT GOTO SAVEIT1 MOVLW D'117' ;IF TOO BIG FORCE TO MAX MOVWF ASETPOINT SAVEIT1 MOVFF ASETPOINT,MYEEDATA MOVLW D'2' MOVWF EEADDRESS CALL WRITEDATA RETURN ASSISTDN MOVLW JOGVALUE ;LOWER THE SETPOINT SUBWF ASETPOINT,F MOVF RSETPOINT,W CPFSLT ASETPOINT ;DONT ALLOW TO CROSS REGEN SETPOINT, GOTO SAVEIT2 MOVFF RSETPOINT,ASETPOINT ;FORCE TO SAME MOVLW B'10100101' MOVWF AMPPORT ;LIGHT ERROR PATTERN BSF BLANKIT ;DISABLE AMPDISPLAY BCF AMPPWM ;DISABLE AMPPWM CLRF AMPMASK BSF SPCROSS SAVEIT2 MOVFF ASETPOINT,MYEEDATA MOVLW D'2' MOVWF EEADDRESS CALL WRITEDATA RETURN REGENUP MOVLW JOGVALUE ADDWF RSETPOINT,F MOVF ASETPOINT,W CPFSGT RSETPOINT ;DONT ALLOW TO CROSS ASSIST SETPOINT, GOTO SAVEIT3 MOVFF ASETPOINT,RSETPOINT ;FORCE TO SAME MOVLW B'10100101' MOVWF AMPPORT ;LIGHT THE LAST AMBER LED BSF BLANKIT ;DISABLE AMPDISPLAY BCF AMPPWM ;DISABLE AMPPWM CLRF AMPMASK BSF SPCROSS SAVEIT3 MOVFF RSETPOINT,MYEEDATA MOVLW D'1' MOVWF EEADDRESS CALL WRITEDATA RETURN REGENDN MOVLW JOGVALUE ;LOWER THE SETPOINT SUBWF RSETPOINT,F BTFSS STATUS,N ;SEE IF NEGATIVE GOTO SAVEIT4 CLRF RSETPOINT SAVEIT4 MOVFF RSETPOINT,MYEEDATA MOVLW D'1' MOVWF EEADDRESS CALL WRITEDATA RETURN ;********************************************************************** ;1/8 SEC SYSTEM HEARTBEAT ;********************************************************************** DO.125SEC BCF SEC.125FLG ;CLEAR FLAG TILL NEXT 1/8 SEC SETS IT AGAIN CALL MAPAVE ;SAMPLE MAP VALUE EACH 1/8 CALL CHECKTHETEMPS BTFSC M2CAL ;IF IN PIMA CAL MODE TOGGLE THE MODE3 LED BTG MODE3LED ;SEE IF MODE 3 LED ON (blinks the mode3 led during calibration RETURN ;********************************************************************** ;1 SEC SYSTEM HEARTBEAT ;********************************************************************** DOAUXTIMER BTFSC LONGHOLD GOTO LONGSWASSET BCF AUXTIMERFLG RETURN LONGSWASSET BTFSC MODE2SW ;IS SWITCH STILL PRESSED? GOTO NOTPRESSED TSTFSZ MPH ;TEST IF STOPPED GOTO NOTPRESSED CALL PIMAOFF BSF MODE3LED BSF JOYCALMODE BCF JOYCALINIT BSF KEYDEBOUNCE BCF PIMAPAUSEFLG MOVLW D'20' MOVWF KEYDELAYH ;EXTEND KEY DELAY ONE TIME SO YOU HAVE TIME TO LIFT YOUR ;DON'T REENTER THE PIMA CAL MODE NOTPRESSED BCF AUXTIMERFLG BCF LONGHOLD RETURN ;********************************************************************** ;AUTOACTIVATION OF ASSIST WHEN SMOOTHED MAP GETS OVER THE AUX JOYSTICK SET THREASHOLD ;********************************************************************** PIMAMAP BTFSS M2CAL ;IF IN CALMODE skip jogcal CALL JOGCAL BSF MODE2LED ;MAKE SURE LED IS ON(WAS FLASHING IF IN LOWSPEED) MOVFF MAPSCALED,TMP0 ;MAP RANGE, 0=.5V, 27=1V, 76=2V, 117=2.8V MOVF ASETPOINT,W CPFSLT TMP0 ;IF TMPO(SCALED MAP) > SETPOINT, SET ASSIST GOTO MAPASSIST MOVF RSETPOINT,W ;IF TMP0 (SCALED map)< RSETPOINT , SET REGEN CPFSGT TMP0 GOTO MAPREGEN MAPPWMTO50 MOVLW D'179' ; NOT IN EITHER REGEN OR ASSIST RANGE MOVWF CMDPWRNEW ;PUT 50% VALUE INTO CMDPWM RETURN MAPASSIST MOVF ASETPOINT,W ;CURRENT SETPOINT SUBWF TMP0,W ;GET DIFFERENCE BETWEEN SETPOINT AND MAP CALL MAGNIFYIT SUBLW D'179' ;SUBTRACT DIFFERENCE FROM CMDPWR MID VALUE MOVWF TMP0 MOVLW D'121' ;CK IF AT MAX ASSIST CPFSLT TMP0 ;IF AT MAX SKIP NEXT AND DEPOSIT 121(MAX ASSIST INTO ADJUST8BIT MOVF TMP0,W MOVWF CMDPWRNEW ;PUT CORRECTED VALUE INTO CMDPWM RETURN MAPREGEN MOVF TMP0,W SUBWF RSETPOINT,W MOVWF TMP0 MOVLW D'179' ADDWF TMP0,F BTFSC STATUS,C ;DID WE OVERFLOW? GOTO CLAMPMAX MOVLW D'240' ;CK IF AT MAX REGEN CPFSGT TMP0 MOVF TMP0,W MOVWF CMDPWRNEW ;PUT CORRECTED VALUE INTO CMDPWM RETURN MAGNIFYIT MOVWF ACCALO ;PUT VALUE IN W(DIFFERENCE BETWEEN SETPOINT AND VALUE)INTO ACCALO MOVFF MAGFACTOR,ACCAHI ;GET MAGFACTOR IN ACCAHI(WILL BE 1,2,3, OR 4) DCFSNZ ACCAHI ;DEC MAG FACT,IF ZERO LEAVE THE DIFFERENCE VALUE ALONE RETURN ;RETURN BCF STATUS,C RLCF ACCALO,F ;MPY VALUEx2 BTFSC STATUS,N ;DID WE GO OVER 255? GOTO MAGMAX DCFSNZ ACCAHI ;DEC MAGFACTOR GOTO MAGDONE BCF STATUS,C RLCF ACCALO,F ;MPY VALUEx4 BTFSC STATUS,N ;DID WE GO OVER 255? GOTO MAGMAX DCFSNZ ACCAHI ;DEC MAGFACTOR GOTO MAGDONE BCF STATUS,C RLCF ACCALO,F ;MPY VALUEx8 BTFSC STATUS,N ;DID WE GO OVER 255? GOTO MAGMAX MAGDONE MOVLW D'61' CPFSLT ACCALO GOTO MAGMAX MOVF ACCALO,W RETURN MAGMAX MOVLW D'61' RETURN ;********************************************************************** ;THE CMDPWR RAMP ROUTINE MAKES TRANSITIONS BETWEEN ANY TWO CMDPWR VALUES SMOOTH BY CHANGING THE VALUE ;ONE UNIT AT A TIME, TO ELIMINATE STEP CHANGES.THE ROUTINE ALSO MAKES THE DECISIONS TO TURN ON ASSIST OR REGEN ;RELAYS TO MAKE THE ASSIST/CHARGE ACTUALLY HAPPEN, AND THEREFORE IS THE CORE CONTROLLER ROUTINE FOR MIMA. ;"CPRAMPCOUNTER"IS THE ACCESS TIMES COUNT ACCUMULATOR. IT IS THE GATEKEEPER THAT ONLY LETS THE ROUTINE RUN AFTER BEING ACCESSED BY THE MAIN LOOP "CPRAMPSPEED"TIMES. ;"CPRAMPSPEED" NUMBERS OF ACCESSES BY THE MAIN LOOP. ;THE RAMP TIMING IS A FUNCTION OF COUNTING THE NUMBER OF TIMES THE SUBROUTINE IS ENTERED ;WHEN IT HAS BEEN ENTERED "CPRAMPSPEED"TIMES, THE ROUTINE IS EXICUTED, AND THE VALUE IS ;INCREMENTED OR DECREMENTED TO THE NEXT VALUE. SINCE THE CMDPWR ROUTINE IS INTERRUPT ;DRIVEN, THE INTERMEDIATE VALUES OF CMDPWRVALUE ARE USED IN THE PULSE GENERATOR CODE ;********************************************************************** CBLOCK CMDPWRVALUE ;THE NEW VALUE FOR THE CMDPWR DUTYCYCLE(FINAL USED IN INT ROUTINE) CMDPWRNEW ;NEW CMDPWR VALUE THAT RAMP SEEKS CPRAMPCOUNTER ;COUNTER FOR NUMBER OF TIMES TO SKIP ROUTINE TO GENERATE THE RAMP SLOPE CPRAMPSPEED ;HOLDS VALUE FOR RAMP SPEED CMDPWRLOCK ;LATCHED CMDPWR VALUE WHEN IN JOYLOCK ENDC RAMPCMDPWR INCF CPRAMPCOUNTER,F MOVF CPRAMPSPEED,W CPFSGT CPRAMPCOUNTER RETURN BTFSC JOYLOCK ;IF THE SYSTEM IN JOYLOCK REPLACE THE CMDPWR VALUE WITH THE STORED VALUE MOVFF CMDPWRLOCK,CMDPWRNEW ;REPLACE VALUE CLRF CPRAMPCOUNTER MOVF CMDPWRVALUE,W ;THE CURRENT VALUE IS COMPARED TO THE NEW VALUE CPFSEQ CMDPWRNEW ;IF THEY ARE THE SAME, THE RAMP IS STOPPED GOTO DIFFERENT ;IF NOT EQUAL DO NEXT RAMP STEP GOTO WHEREAREWE ;DO ASSIST/CHARGE DETERMINATIONS DIFFERENT MOVF CMDPWRVALUE,W ;GET CURRENT VALUE INTO W CPFSLT CMDPWRNEW ;IS NEW VALUE< CURRENT VALUE? GOTO CPRAMPUP ;WAS > SO DO RAMP UP DECF CMDPWRVALUE,F ;WAS < SO DECREMENT THE CMDPWR VALUE GOTO WHEREAREWE ;GO DECIDE WHERE THE VALUE IS CPRAMPUP INCF CMDPWRVALUE,F ;INCREMENT THE CMDPWR VALUE WHEREAREWE MOVLW ASSISTLEVEL ;GET ASSIST ACTIVATION POINT(JOYSTICK ASSIST THRESHOLD) CPFSLT CMDPWRVALUE ;SEE IF CMDPWRVALUE IS LESS THAN SETPOINT GOTO TESTCHARGE ;WAS NOT IN ASSIST ZONE CHECK CHARGE MAMODE1_25 BSF MIMASTANDBY ;WE ARE IN ASSIST ZONE SO TURN ON THE MIMA ENABLE RELAY MOVLW H'B7' ;ADJUST THE MAMODE 1 DUYTCYCLE TO 25% MOVWF ccpr1l ;the new pwm duty cycle is set. BSF ASSISTENABLED ;TURN ON MAMODE1 RELAY AND MAMODE2 PULL DOWN TRANSISTOR BTFSC MODE2FLAG ;SKIP MODE 1 TURN ON IF IN pima RETURN BTFSS BSPJOG BSF MODE1LED RETURN TESTCHARGE MOVLW CHARGELEVEL ;GET CHARGE ACTIVATION POINT (JOYSTICK CHARGE THRESHOLD) CPFSGT CMDPWRVALUE ;SEE IF CMDPWRVALUE > THRESHOLD GOTO INMIDDLE ;WAS IN NOT IN ASSIST OR CHARGE ZONE SO GO TO MIDDLE ROUTINE MAMODE1_50 BSF MIMASTANDBY ; WAS IN CHARGE ZONE,TURN ON THE MIMA ENABLE RELAY MOVLW H'7D' ;SET 50% VALUE FOR MAMODE1, AND TURN OFF THE MAMODE1 RELAY MOVWF ccpr1l ;the new pwm duty cycle is set. BCF ASSISTENABLED ;TURN OFF THE ASSISTREQ LINE BTFSC MODE2FLAG ;SKIP MODE 1 TURN ON IF IN pima RETURN BTFSS BSPJOG BSF MODE1LED RETURN INMIDDLE MOVLW H'7D' ;SET THE MAMODE1 TO 50% MOVWF ccpr1l ;the NEUTRAL duty cycle is set. BCF ASSISTENABLED ;TURN OFF THE ASSISTREQ LINE MOVFF PIMARAMPSPEED,CPRAMPSPEED BTFSC HARDMIMA ;IF IN MIMA ACTIVE SKIP TURN OFF RETURN TURNITOFF BTFSC MODE2FLAG ;NOT IN MIMA ACTIVE,OR pima SO GO BACK TO ima MODE RETURN BTFSS BGPAUSEFLG ;DONT TURN OFF IF IN BGPAUSE BCF MODE1LED ;SHUT OFF ONLY IF MODE 1 AND BGPAUSE OFF BCF MODE1FLAG BCF MIMASTANDBY BCF ASSISTENABLED RETURN ;********************************************************************** ;get all a/d signals (10 bit) ;********************************************************************** doconversions ;GET JOYSTICK (AN0) MOVLW b'10000001' ;set up to do JOYSTICK conversion MOVWF adcon0 CALL ADDELAY BSF adcon0,go wait4JOY BTFSC adcon0,go ;keep checking the done bit GOTO wait4JOY MOVF adresh,w MOVWF JOYXH MOVF adresl,w MOVWF JOYXL ;GET AUX JOYSTICK(AN1) MOVLW b'10001001' ;set up to do JOYSTICK AUX conversion MOVWF adcon0 CALL ADDELAY BSF adcon0,go wait4AUX BTFSC adcon0,go ;keep checking the done bit GOTO wait4AUX MOVF adresh,w MOVWF JOYYH MOVF adresl,w MOVWF JOYYL ;GET BATTERY AMPS(AN2) MOVLW b'10010001' ;set up to do BATTERY AMPS conversion MOVWF adcon0 CALL ADDELAY BSF adcon0,go wait4BAMPS BTFSC adcon0,go ;keep checking the done bit GOTO wait4BAMPS MOVF adresh,w MOVWF BAMPSH MOVF adresl,w MOVWF BAMPSL ;GET BATTERY TEMP(AN3) MOVLW b'10011001' ;set up to do BATTERY TEMP conversion MOVWF adcon0 CALL ADDELAY BSF adcon0,go wait4BTEMP BTFSC adcon0,go ;keep checking the done bit GOTO wait4BTEMP MOVF adresh,w MOVWF BTEMPH MOVF adresl,w MOVWF BTEMPL ;GET MPI TEMP(AN4) MOVLW b'10100001' ;set up to do BATTERY TEMP conversion MOVWF adcon0 CALL ADDELAY BSF adcon0,go wait4MPITEMP BTFSC adcon0,go ;keep checking the done bit GOTO wait4MPITEMP MOVF adresh,w MOVWF MPITEMPH MOVF adresl,w MOVWF MPITEMPL ;GET THROTTLE POSITION (AN5) MOVLW b'10101001' ;set up to do Throttle position conversion MOVWF adcon0 CALL ADDELAY BSF adcon0,go wait4TP BTFSC adcon0,go ;keep checking the done bit GOTO wait4TP MOVF adresh,w MOVWF THROTTLEH MOVF adresl,w MOVWF THROTTLEL ;GET MAP SENSOR (AN6) MOVLW b'10110001' ;set up to do MAP SENSOR conversion MOVWF adcon0 CALL ADDELAY BSF adcon0,go wait4MAP BTFSC adcon0,go ;keep checking the done bit GOTO wait4MAP MOVF adresh,w MOVWF MAPHI ;MAP DATA HAS A MAX OF ABOUT 600 0R 2.8V MOVF adresl,w MOVWF MAPLO ;GET AMBIENT LIGHT (AN7) MOVLW b'10111001' ;set up to do AMBIENT LIGHT conversion MOVWF adcon0 CALL ADDELAY BSF adcon0,go wait4LIGHT BTFSC adcon0,go ;keep checking the done bit GOTO wait4LIGHT MOVF adresh,w MOVWF AMBIENTLTHI MOVF adresl,w MOVWF AMBIENTLTLO RETURN ;********************************************************************** ;adjust the dytycycle of the display PWM brightness control ; ;********************************************************************** DOBRIGHT TSTFSZ CALMODE ;DO ROUTINE IF IN CALMODE1 RETURN MOVFF JOYSTICKY,DISPLAYBRT ;SAVE VALUE IN DISPLAYBRT COMF DISPLAYBRT ;invert value so that up makes the leds brighter MOVLW BRTOFFSET SUBWF DISPLAYBRT BTFSC STATUS,C ;IS RESULT NEG? GOTO CK4MAX MOVLW D'1' MOVWF DISPLAYBRT ;IF YES, FORCE TO 1 GOTO PUTITOUT CK4MAX MOVLW D'145' CPFSGT DISPLAYBRT ;IF DISPLAY BRT>145 GOTO PUTITOUT MOVLW D'255' ;FORCE TO MAX MOVWF DISPLAYBRT PUTITOUT MOVFF DISPLAYBRT,CCPR2L RETURN ;********************************************************************** ;********************************************************************** ;grabs current key condition and inverts the logic from Port = b'1101', ;after inversion b'0010' ;Keys are checked each loop through the main loop,if a key press is ;detected, the keydebounce flag is set, which disables further key press ;detection until the key delay counter reaches 0. At that point the keys are rechecked each ;pass through the program, and the key debounc counter is initialized and flag cleared waiting ; for the next key. This gives fast responce to a key press, but does an effective debounce. getkeys BTFSS KEYDEBOUNCE ;IF KEYDEBOUNCE IS SET DO DELAY GOTO CHECKKEY ;COUNTS ENTRYS INTO THIS ROUTINE IF SO UNLOCK MOVLW MAPWINDOW SUBWF MAPLOCK,W BTFSC STATUS,N ;IS RESULT NEG?IF SO LOCK TO 0 MOVLW D'0' MOVWF TMP0 ;UPPER SETPOINT FOR MAP RELEASE CPFSGT MAPSCALED ;IS CURRENT MAP >SETPOINT? GOTO UNLOCKIT ;WAS=< SO UNLOCK BTFSC JOYRTC ;IS THE STICK BACK IN THE CENTER YET? (0) RETURN ;NOT BACK TO CENTER SO DON'T CK BOTHJOGINMID YET BTFSC XINDEAD GOTO UNLOCKIT ;jOY WAS MOVED AGAIN SO UNLOCK IT. MOVLW D'10' CPFSLT MPH ;UNLOCK IF SPEED <10MPH RETURN GOTO UNLOCKIT ;********************************************************************** ;GOT HERE BECAUSE THE JOYSTICK SW WAS PRESSED. ;JOYSTICK LOCK WILL STORE THE MAP SETTING AND THE CMDPWR SETTING AT THE TIME OF THE JOYSTICK ;SWITCH PRESS WHEN IN THE IMA AND MODE1 MODES. ;********************************************************************** JOYSTICKLOCK BTFSC M2CAL ;SKIP IF IN CAL MODE (HI) RETURN BTFSC MODE2FLAG ;SKIP IF IN pima MODE(HI) RETURN BTFSS JOYLOCK ;CHECK IF ALREADY LOCKED GOTO LOCKIT ;NOT YET LOCKED RETURN ;NOT BACK IN CENTER LOCKIT NOP ;LOCK THE CMDPWR AND MAP VALUES BTFSS XINDEAD ; IS JOYSTICK IN CENTER(LO) RETURN ;JOY IN CENTER SO DON'T DO ANYTHING BSF JOYLOCK ;JOYSTICK NOT IN CENTER SO SET LOCK FLAG BSF JOYRTC ;SET BOTHJOGINMID AS WE HAVE LEFT THE CENTER FOR THE FIRST TIME MOVFF MAPSCALED, MAPLOCK ;SAVE CURRENT MAP VALUE MOVFF CMDPWRNEW,CMDPWRLOCK ;SAVE CURRENT CMDPWRNEW VALUE IN CMDPWRLOCK RETURN UNLOCKIT BCF JOYLOCK BCF JOYRTC RETURN ;********************************************************************** ;PRESSING THE JOYSTICK CENTRAL BUTTON WILL SAVE THE CALIBRATION VALUE TO THE APPROPRIATE ;PLACE IN THE EEPROM IF IN THE CAL MODE, OTHERWISE IT JUST ACTIVATES THE AR2 OUTPUT ;THIS ROUTINE IS ONLY ENTERED WHEN THE SWITCH IS PRESSED ;EEADRESS ARE: ;0=DISPLAY BRIGHTNESS SET WITH AUX JOYSTICK POSITION ;*1=RSETPOINT *RSETPOINT SET WITH JOG ;*2=ASETPOINT *ASETPOINT SET WITH JOG ;3=MAGFACTOR CALMODE1=MAGFACTOR ;*4=BGCHARGELEVEL *BGCHARGE LEVEL SET WITH JOG ;5=PIMARAMPSPEED CALMODE2=PIMARAMP SPEED ;6=JOYRAMPSPEED CALMODE3=JOYSTICK RAMP SPEED ;7=OPFLAG CALMODE4=OPFLAG BIT-0(STOPASSIST) ; CALMODE5=OPFLAG BIT-1(ABCSETSWAP) ; CALMODE6=OPFLAG BIT-2 (OPFL2) ; CALMODE7=OPFLAG BIT-3 (SWAPAR1) ; CALMODE8=OPFLAG BIT-4 ; CALMODE9=OPFLAG BIT-5 ; CALMODE10=OPFLAG BIT-6 BIT 7 ALWAYS CLEAR ; *ABC SETPOINT SET WITH JOG ;********************************************************************** sw3 BSF KEYDEBOUNCE ;KEY WAS PRESSED SET DEBOUNCE CALL SETAR2 ;JOYSWITCH PRESSED TRY to SET AR2 CALL JOYSTICKLOCK CALL TOGGLEABCJOG ;CALIBRATION ROUTINES USE THE CALMODE FLAG TO DETERMINE IF THEY ARE THE ACTIVE MODE TSTFSZ CALMODE ;IF STICK PRESSED IN CALMODEO, SAVE BRIGHTNESS GOTO CK4MAG BTFSS M2CAL GOTO CK4MAG MOVFF DISPLAYBRT,MYEEDATA ;WRITE THE BRIGHTNESS VALUE TO FLASH CLRF EEADDRESS CALL WRITEDATA CK4MAG MOVLW D'1' ;CALMODE 1 SETS THE ASSIST MAG FACTOR CPFSEQ CALMODE GOTO CKFOR2 ;NOT MAGFACTOR CK IF PIMA MOVFF JOYSTICKY,TMP0 ;SAVE PRESENT scaled 8bit VALUE IN MAGNIFY FACTOR MOVLW D'156' CPFSLT TMP0 GOTO SETMAG1 MOVLW D'127' CPFSLT TMP0 GOTO SETMAG2 MOVLW D'97' CPFSLT TMP0 GOTO SETMAG3 MOVLW D'4' MOVWF MAGFACTOR MOVLW B'10000001' ;MUST BE 4 MOVWF AMPPORT SAVEMAG MOVFF MAGFACTOR,MYEEDATA MOVLW D'3' MOVWF EEADDRESS CALL WRITEDATA RETURN SETMAG1 MOVLW D'1' MOVWF MAGFACTOR MOVLW B'00011000' MOVWF AMPPORT GOTO SAVEMAG SETMAG2 MOVLW D'2' MOVWF MAGFACTOR MOVLW B'00100100' MOVWF AMPPORT GOTO SAVEMAG SETMAG3 MOVLW D'3' MOVWF MAGFACTOR MOVLW B'01000010' MOVWF AMPPORT GOTO SAVEMAG CKFOR2 MOVLW D'2' ;CALMODE 2 SETS THE PIMA RAMP SPEED CPFSEQ CALMODE GOTO CKFOR3 BCF STATUS,C RRCF JOYSTICKY,F ;DIVIDE (7BITS 127 MAX) BCF STATUS,C RRCF JOYSTICKY,F ;DIVIDE (6 BITS 63 MAX) MOVLW D'64' ;MAX VALUE POSSIBLE BCF STATUS,C ;CLEAR STATUS SUBFWB JOYSTICKY,F ;INVERT JOYSTICK VALUE MOVFF JOYSTICKY,PIMARAMPSPEED ;SAVE PRESENT VALUE IN RAMP SPEED SETPOINT MOVFF PIMARAMPSPEED,MYEEDATA MOVLW D'5' MOVWF EEADDRESS CALL WRITEDATA RETURN CKFOR3 MOVLW D'3' ;CALMODE3 SETS THE JOYSTICK RAMP SPEED CPFSEQ CALMODE GOTO CKFOR4 BCF STATUS,C RRCF JOYSTICKY,F ;DIVIDE (7BITS 127 MAX) BCF STATUS,C RRCF JOYSTICKY,F ;DIVIDE (6 BITS 63 MAX) joystick wants to be faster than PIMA BCF STATUS,C RRCF JOYSTICKY,F ;DIVIDE (5 BITS 31 MAX) so we will limit the cal range to 0-15 BCF STATUS,C RRCF JOYSTICKY,F ;DIVIDE (4 BITS 15 MAX) MOVLW D'16' ;MAX VALUE POSSIBLE BCF STATUS,C ;CLEAR STaTUS SUBFWB JOYSTICKY,F ;INVERT JOYSTICK VALUE MOVFF JOYSTICKY,JOYRAMPSPEED ;SAVE PRESENT VALUE IN RAMP SPEED SETPOINT MOVFF JOYRAMPSPEED,MYEEDATA MOVLW D'6' MOVWF EEADDRESS CALL WRITEDATA RETURN CKFOR4 MOVLW D'4' ;CALMODE 4 OPFLAG BIT 0 STOPFLAG 0=ASSIST DISABLED 1=ASSIST ENABLED WHEN STOPPED CPFSEQ CALMODE GOTO CKFOR5 BTG STOPASSIST ;TOGGLE THE STOP FLAG IN OPFLAG NOP BTFSS STOPASSIST ;IF ON SAVE GOTO BOBLINK MOVFF AMPMASK,AMPPORT ;MAKE SURE IT IS ON BCF TOBLINK ;STOP THE BLINKING SAVEB0 MOVFF OPFLAG,MYEEDATA MOVLW D'7' MOVWF EEADDRESS CALL WRITEDATA RETURN CKFOR5 MOVLW D'5' ;CALMODE 5 OPFLAG BIT 1 CPFSEQ CALMODE GOTO CKFOR6 BTG SWAPABCSET ;TOGGLE THE FLAG IN OPFLAG NOP BTFSS SWAPABCSET ;IF ON SAVE GOTO B1BLINK MOVFF AMPMASK,AMPPORT ;MAKE SURE IT IS ON BCF TOBLINK ;STOP THE BLINKING SAVEB1 MOVFF OPFLAG,MYEEDATA MOVLW D'7' MOVWF EEADDRESS CALL WRITEDATA RETURN CKFOR6 MOVLW D'6' ;CALMODE 6 OPFLAG BIT 2 CPFSEQ CALMODE GOTO CKFOR7 BTG OPFL2 ;TOGGLE THE FLAG IN OPFLAG NOP BTFSS OPFL2 ;IF ON SAVE GOTO B2BLINK MOVFF AMPMASK,AMPPORT ;MAKE SURE IT IS ON BCF TOBLINK ;STOP THE BLINKING SAVEB2 MOVFF OPFLAG,MYEEDATA MOVLW D'7' MOVWF EEADDRESS CALL WRITEDATA RETURN CKFOR7 MOVLW D'7' ;CALMODE 7 OPFLAG BIT 3 CPFSEQ CALMODE GOTO CKFOR8 BTG SWAPAR1 ;TOGGLE THE FLAG IN OPFLAG NOP BTFSS SWAPAR1 ;IF ON SAVE GOTO B3BLINK MOVFF AMPMASK,AMPPORT ;MAKE SURE IT IS ON BCF TOBLINK ;STOP THE BLINKING SAVEB3 MOVFF OPFLAG,MYEEDATA MOVLW D'7' MOVWF EEADDRESS CALL WRITEDATA RETURN CKFOR8 MOVLW D'8' ;CALMODE 8 OPFLAG BIT 4 CPFSEQ CALMODE GOTO CKFOR9 BTG OPFL4 ;TOGGLE THE FLAG IN OPFLAG NOP BTFSS OPFL4 ;IF ON SAVE GOTO B4BLINK MOVFF AMPMASK,AMPPORT ;MAKE SURE IT IS ON BCF TOBLINK ;STOP THE BLINKING SAVEB4 MOVFF OPFLAG,MYEEDATA MOVLW D'7' MOVWF EEADDRESS CALL WRITEDATA RETURN CKFOR9 MOVLW D'9' ;CALMODE 9 OPFLAG BIT 5 CPFSEQ CALMODE GOTO CKFOR10 BTG OPFL5 ;TOGGLE THE FLAG IN OPFLAG NOP BTFSS OPFL5 ;IF ON SAVE GOTO B5BLINK MOVFF AMPMASK,AMPPORT ;MAKE SURE IT IS ON BCF TOBLINK ;STOP THE BLINKING SAVEB5 MOVFF OPFLAG,MYEEDATA MOVLW D'7' MOVWF EEADDRESS CALL WRITEDATA RETURN CKFOR10 MOVLW D'10' ;CALMODE 10 OPFLAG BIT 6 BIT 7 CPFSEQ CALMODE GOTO CKFOR11 BTG MAXAB1 ;TOGGLE THE FLAG IN OPFLAG NOP BTFSS MAXAB1 ;IF ON SAVE GOTO B6BLINK MOVFF AMPMASK,AMPPORT ;MAKE SURE IT IS ON BCF TOBLINK ;STOP THE BLINKING SAVEB6 MOVFF OPFLAG,MYEEDATA MOVLW D'7' MOVWF EEADDRESS CALL WRITEDATA RETURN CKFOR11 MOVLW D'11' ;CALMODE 9 OPFLAG BIT 5 CPFSEQ CALMODE RETURN BTG MAXAB2 ;TOGGLE THE FLAG IN OPFLAG NOP BTFSS MAXAB2 ;IF ON SAVE GOTO B7BLINK MOVFF AMPMASK,AMPPORT ;MAKE SURE IT IS ON BCF TOBLINK ;STOP THE BLINKING SAVEB7 MOVFF OPFLAG,MYEEDATA MOVLW D'7' MOVWF EEADDRESS CALL WRITEDATA RETURN BOBLINK BSF TOBLINK ;TURN ON THE BLINK FLAG( BIT IS OFF SO BLINK) GOTO SAVEB0 B1BLINK BSF TOBLINK ;TURN ON THE BLINK FLAG( BIT IS OFF SO BLINK) GOTO SAVEB1 B2BLINK BSF TOBLINK ;TURN ON THE BLINK FLAG( BIT IS OFF SO BLINK) GOTO SAVEB2 B3BLINK BSF TOBLINK ;TURN ON THE BLINK FLAG( BIT IS OFF SO BLINK) GOTO SAVEB3 B4BLINK BSF TOBLINK ;TURN ON THE BLINK FLAG( BIT IS OFF SO BLINK) GOTO SAVEB4 B5BLINK BSF TOBLINK ;TURN ON THE BLINK FLAG( BIT IS OFF SO BLINK) GOTO SAVEB5 B6BLINK BSF TOBLINK ;TURN ON THE BLINK FLAG( BIT IS OFF SO BLINK) GOTO SAVEB6 B7BLINK BSF TOBLINK ;TURN ON THE BLINK FLAG( BIT IS OFF SO BLINK) GOTO SAVEB7 ;********************************************************************** ;The amps display will have 4 green leds indicating the charge current, and 4 red leds ;indicating the assist amps.Since the max charge rate is 50A, and the max assist current is 100A, ;The leds for the charge will be scaled differently to take advantage of the full resolution ;A dead band of +- 1 amp will be centered around the 0 amp point so the bar does not flicker ;The 5V 10bit, 0-1024 count A/D = .004883v per count. ;The current sensor output is .02V/amp= 4.09 counts per amp ;The current sensor output was shifted so that 0 amps = 2V = 410 counts, max regen of 50A = 1V=205 counts, max assist ;of 100A=4V=819 counts. ;An expanded charge scale kicks in for 10 seconds when the background charge is jogged ;this doubles the resolution of the amp meter for fine adjustment of the charge level. ; Thresholds: ;- 75.1- 100A led1,2,3,4 = 718 - 819 counts ;- 5.1-75A led1,2,3 = 615 - 717 counts ;- 25.1-50A led1,2 = 513 - 614 counts ;- 1-25A led1 = 413 - 512 counts ;Assist, Red leds, ;regen,Green leds, EXPANDED SCALE ;+ 1-13A led1 = 405 - 356 counts 1-5A LED1 =405-390 ;+13.1-26A led1,2 = 355 - 303 counts 5.1A-10A LED1,2 =389-370 ;+ 26.1-40A led1,2,3 = 302 - 246 counts 10.1A-15A LED1,2,3 =369-350 ;+ 40.1-50A led1,2,3,4 = 245 - 205 counts 15.1A-20A LED1,2,3,4 =349-330 ;************************************ AMPS BTFSC BLANKIT ;FLAG TO BLANK THE AMP DISPLAY RETURN BTFSS EXPCHARGE ;***************THE EXPANDED AMPMETER CODE************************* GOTO NMLSCALE BSF AMPPWM ;SET AMP PWM SO WE CAN MODULATE THE LAST AMP LED MOVLW H'01' ;IS BAT AMPS < D'349'= H'015D' MOVWF ACCAHI MOVLW H'5D' MOVWF ACCALO MOVFF BAMPSH,ACCBHI MOVFF BAMPSL,ACCBLO CALL DOUBLESUB BTFSS STATUS,N GOTO ETEST1 BTFSS AMPPWM GOTO EDOOUT1 MOVLW B'01111111' ;HAVE WE OUTPUT THIS YET? CPFSEQ AMPMASK ; THE PWM AND THE AMPROUTINE ARE GENERATING DATA AND SAMPLING DATA ASYNCRONUSLY GOTO EDOOUT1 ; GOTO ESKIPOUT1 EDOOUT1 MOVLW B'01110000' ;BATAMPS252? GOTO SETTHEDUTY MOVLW D'252' MOVWF AMPDIF SETTHEDUTY MOVFF AMPDIF,AMPDUTY RETURN ;********************************************************************** ; IF JOYSTICK 8 BIT ADJUSTED VALUE IS >50%, SWITCH MAMODE1 TO 25%duty and turn on mamode2 transistor ;********************************************************************** READJOYSTICK MOVFF JOYSTICKX,TMP2 BCF STATUS,C RRCF TMP2,F FULLSCALE MOVLW JOYOFFSET ADDWF TMP2,F MOVFF TMP2,CMDPWRNEW ;range of values to the range needed for full range of assist/charge MOVLW D'240' ; check limits CPFSLT CMDPWRNEW CALL CLAMPMAX ;CMDPWRNEW=240@MAX REGEN, 179@CENTER, 121 MAX ASSIST MOVLW D'121' CPFSGT CMDPWRNEW CALL CLAMPMIN ;CHECK TO SEE IF THE VALUE IS IN THE ASSIST/CHARGE ZONE AND SET FLAG IF YES BTFSS XINDEAD ;IS X STICK IN MIDDLE? 0=YES 1=NO GOTO JOYNOTMOVED ; GO TO NOT MOVED IF IN MID BTFSS XMOVEDIR ; 0=ASSIST, 1=CHARGE GOTO CKWASCHARGE ;NOT IN ASSIST, SO CK CHARGE BTFSC STOPASSIST ;IF SET DONT STOP ASSIST AT STOP GOTO JOYRAMPSET ;SKIPS MPH TEST SETS JOYRAMP SPEED TSTFSZ MPH ;IF mph AT ZERO, SET ASSIST CMDPWR TO MID GOTO JOYRAMPSET ;ALSO FORCE RAMP TO THE SLOWER pima RAMP. MOVLW D'179' MOVWF CMDPWRNEW MOVFF PIMARAMPSPEED,CPRAMPSPEED RETURN JOYRAMPSET MOVFF JOYRAMPSPEED,CPRAMPSPEED ;SKIPS MPH TEST SETS JOYRAMP SPEED RETURN CKWASCHARGE MOVFF JOYRAMPSPEED,CPRAMPSPEED ;GET RAMP SPEED TO JOYSTICK VALUE RETURN JOYNOTMOVED BTFSS JOYLOCK ;TEST SO MODE1LED IS ONLY CLEARED ONCE GOTO NOTMOVED BCF JOYRTC ;CLEAR THE RTC FLAG SO JOYMOVED CAN TURN OFF JOYLOCK BTFSC JOYLOCK ;ARE WE IN JOYLOCK? GOTO NOTMOVED ;IF YES LEAVE MODE1 LED ON BTFSS HARDMIMA BCF MODE1LED NOTMOVED MOVLW D'179' MOVWF CMDPWRNEW CPFSEQ CMDPWRVALUE RETURN MOVFF PIMARAMPSPEED,CPRAMPSPEED ;GET RAMP BACK TO pima RETURN ;********************************************************************** ;CLAMPS CMDPWR TO MAX VALUE (regen) CLAMPMAX MOVLW D'240' MOVWF CMDPWRNEW RETURN ;********************************************************************** ;CLAMPS CMDPWR TO MIN VALUE (assist) CLAMPMIN MOVLW D'121' MOVWF CMDPWRNEW RETURN ;********************************************************************** ;DETERMINES THE CONDITION OF THE FOLLOWING FLAGS ;JOYFLAG BIT0 = XMOVEDIR 1=ASSIST 0=CHARGE < 127 > ON JOYSTICKX CORRECTED VALUES <127 = ASSIST ;JOYFLAG BIT1 = YMOVEDIR 0=JOGUP 1=JOGDN < 127 > ON JOYSTICKY CORRECTED VALUES <127 = JOGUP ;JOYFLAG BIT2 = XINDEAD 0= IN TRUE MIDDLE 1= OUT OF DEADBAND ;JOYFLAG BIT3 = YINDEAD 0= IN TRUE MIDDLE 1= OUT OF DEADBAND ;JOYFLAG BIT4 = BOTHINDEAD 0=BOTH STICKS IN DEADZONE 1= NOT IN DEADZONE ;JOYFLAG BIT5 = XJOGINMID 0=STICK IN JOG MIDDLE 1= NOT IN MIDDLE ;JOYFLAG BIT6 = YJOGINMID 0=STICK IN JOG MIDDLE 1= NOT IN MIDDLE ;JOYFLAG BIT7 = BOTHJOGINMID 0=BOTH STICKS IN JOG MIDDLE 1= NOT IN MIDDLE ;********************************************************************** JOYMIDCK CLRF JOYFLAG ;START BY CLEARING THE LAST CONDITION MOVLW JOGTHRESLO CPFSGT JOYSTICKY GOTO SETMIDY ;OUT OF MID MOVLW JOGTHRESHI CPFSLT JOYSTICKY GOTO SETMIDY BCF YJOGINMID ;WAS IN MIDDLE GOTO XMIDCHECK SETMIDY BSF YJOGINMID ;WAS NOT IN MIDDLE XMIDCHECK MOVLW JOGTHRESLO CPFSGT JOYSTICKX GOTO SETMIDX ;OUT OF MID MOVLW JOGTHRESHI CPFSLT JOYSTICKX GOTO SETMIDX BCF XJOGINMID ;WAS IN MIDDLE GOTO CKFORBOTH SETMIDX BSF XJOGINMID ;WAS NOT IN MIDDLE CKFORBOTH BCF BOTHJOGINMID ;ASSUME IN MIDDLE BTFSC YJOGINMID BSF BOTHJOGINMID BTFSC XJOGINMID BSF BOTHJOGINMID MOVEDIR MOVLW D'127' ;IF IN DEADZONE WILL RETURN 127 CPFSEQ JOYSTICKY CALL STICKYNOTINDEAD CPFSEQ JOYSTICKX CALL STICKXNOTINDEAD RETURN STICKYNOTINDEAD BSF YINDEAD ;SET THE IN DEAD FLAG (NOT IN DEAD) BSF BOTHINDEAD ;BOTH NOT IN CENT CPFSGT JOYSTICKY ;IS THE STICK > 127 BSF YMOVEDIR ; MUST BE < 127 OR ASSIST RETURN STICKXNOTINDEAD BSF XINDEAD ;SET THE IN DEAD FLAG (NOT IN DEAD) BSF BOTHINDEAD ;BOTH NOT IN CENT CPFSGT JOYSTICKX ;IS THE STICK > 127 BSF XMOVEDIR ; MUST BE < 127 OR ASSIST RETURN ;********************************************************************** ;Utility long and short delay routines ; local delaylo, delayhi cblock delaylo endc ADDELAY MOVLW ADWAIT MOVWF DELAYLO GOTO WLOOP1 waitshort CLRF DELAYLO wloop1 DECFSZ delaylo,f GOTO wloop1 RETURN cblock delayhi endc MLOOPDLY MOVLW MLOOPDELAY MOVWF delayhi waitlong wloop2 CALL waitshort DECFSZ delayhi,f GOTO wloop2 RETURN ;********************************************************************** ;GENERATES A .125 SEC AND aux TIME BASE IS CALLED FROM THE INT ROUTINE AFTER TIMER3 TIMES OUT ;TIMER3 HAS A 1:2 PRESCALE SO IT GETS 2,500,00 COUNTS PER SEC. ;IT IS LOADED WITH 3072 EACH ROLLOVER, LEAVING 62463 COUNTS ;2,500,000/62463 = .025 SEC PER TICK ;WE COUNT 5 OF THESE TO YIELD A .125 SEC TIMEBASE ;********************************************************************** TIMEBASE BSF SEC.125FLG ;FLAG SET ON RESET DECFSZ AUXTIMER ;DECREMENTS AND TEST FOR ZERO WHEN IT TIMES OUT, RETURN BSF AUXTIMERFLG ;SET FLAG MUST ME RESET ELSEWHERE STARTAUX MOVLW AUXTIMEINIT ;REINIT THE TIMER MOVWF AUXTIMER RETURN ;********************************************************************** ;runs only once during start up or after a reset ;********************************************************************** init ;initilizes the ports CLRF PORTA ;CLEAR OUTPUT DATA LATCHES CLRF PORTB CLRF PORTC CLRF PORTD CLRF WRITECOUNTER CLRF READCOUNTER MOVLW D'255' MOVWF AMPMASK MOVLW B'00000000' MOVWF FLAG1 MOVWF FLAG2 MOVWF FLAG3 MOVWF FLAG4 MOVWF OPFLAG MOVLW SETRAMPSPEED MOVWF CPRAMPSPEED ;INIT RAMP SPEED TO SETRAMPSPEED MOVWF JOYCONFIG MOVLW h'f9' ;set the pwm period 0xF9 =20KHZ MOVWF PR2 ;SAVE IN SFR PR2 CLRF CCPR1L ;clear pwm-1 period LO reg MOVLW B'01000011' ;SET UP TIMER 0 ON,8 BIT,INT CLOCK,PRESCALE ON,PRESCALE 256. MOVWF T0CON ;is used to generate the cmd pwr PWM MOVLW b'00000100' ;b'00000100'=20khz PWM period MAMODE1 MOVWF T2CON ;enable timer,set prescale to 1 MOVLW B'00110001' ;TIMER1 SET FOR 1:8 PRESCALE, INTERNAL CLOCK TIMER ENABLED MOVWF T1CON ;VSS SPEED COUNTER MOVLW b'00001110' ;control byte to set ccp mode to pwm MOVWF CCP1CON ;pwm set up MOVWF CCP2CON MOVLW b'10000001' ;configure a/d converter port ra0, osc/32 MOVWF ADCON0 MOVLW B'10000000' MOVWF ADCON1 ;SET ANALOG INPUT CHANNELS AN0,AN1,AN2,AN3,AN4,AN5,AN6,AN7 TO ON RIGHT JUSTIFY MOVLW h'7D' ;preset the pwm at 50% duty cycle MOVWF CCPR1L MOVWF CCPR2L MOVLW B'00000010' ;ENABLE TIMER 3 INTERUPT MOVWF PIE2 BCF PIR2,1 ;CLEAR INTFLAG MOVLW B'00000011' ;ENABLE TIMER1 OVERFLOW INT MOVWF PIE1 ;AND TIMER2 MATCH INT MOVLW B'00000001' ;TIMER3 SETUP INT CLOCK PRESCALE 1:1 MOVWF T3CON MOVLW B'10101111' ;SET ALL PORT A PINS AS INPUTS except pin RA4,AND RA6, MOVWF TRISA MOVLW B'11001111' ;SET PORT B PINS 0,1,2,3,6,7 TO IN, PINS 4,5 TO OUT MOVWF TRISB MOVLW B'00000001' ;SET ALL PORT C AS OUTPUT except rc0 (Vss pulses) MOVWF TRISC MOVLW B'00000000' ;SET ALL PORT D AS OUTPUT MOVWF TRISD Movlw B'00000111' ;SET PORT E 0,1,2 AS (ANALOG) THE REST OUT MOVWF TRISE movlw D'1' MOVWF TIMER.125SEC MOVLW b'11110000' ;Global interupt, exteral int0 enabled PERIPHERAL INT ;the interupts all vector to 008 as the priority bit is cleared MOVWF INTCON CLRF RCON CALL STARTAUX MOVLW b'01010000' ; port b pull up enabled,rbo/int0 to rising edge triggerInt2 set for rising edge MOVWF INTCON2 MOVLW B'00010000' ;enable int2 MOVWF INTCON3 MOVLW KEYWAITH MOVWF KEYDELAYH MOVLW KEYWAITL MOVWF KEYDELAYL MOVLW D'179' MOVWF CMDPWRVALUE ; INITILIZE DUTYCYCLE REG TO 50% MOVWF CMDPWRNEW ;NEW CMDPWR VALUE THAT RAMP SEEKS ALSO 50% MOVLW D'7' ;SET UP TEMP COUNTER MOVWF TMP0 MOVLW B'10000000' ;Bootup display pattern (version number) MOVWF AMPPORT MOVLW D'2' MOVWF TMP1 ;SET UP DELAY BETWEEN SCROLLS BSF AR1 STABILIZE1 BTFSS SEC.125FLG GOTO STABILIZE1 BCF SEC.125FLG DECFSZ TMP1 GOTO STABILIZE1 MOVLW D'1' MOVWF TMP1 BCF STATUS,C RRNCF AMPPORT,F DECFSZ TMP0 GOTO STABILIZE1 CLRF CALMODE CLRF EEADDRESS ;GET BRIGHTNESS VALUE FROM FLASH address 0 CALL READDATA MOVFF MYEEDATA,CCPR2L MOVFF CCPR2L,DISPLAYBRT GETASET MOVLW D'2' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,ASETPOINT ;IF GOOD DATA INITILIZE ASETPOINT WITH EE DATA MOVLW D'117' CPFSLT ASETPOINT GOTO FIXASET GOTO GETRSET FIXASET MOVLW D'81' MOVWF ASETPOINT ;INITILIZE GETRSET MOVLW D'1' ;GET LAST DATA FROM EEPROM MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,RSETPOINT ;IF GOOD DATA INITILIZE RSETPOINT WITH EE DATA MOVF ASETPOINT,W CPFSGT RSETPOINT GOTO GETMAG FIXRSET MOVFF ASETPOINT,RSETPOINT GETMAG MOVLW D'3' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,MAGFACTOR ;IF GOOD DATA INITILIZE MAGFACTOR WITH EE DATA MOVLW D'5' ;RANGE OF VALID VALUES IS 1-4 CPFSLT MAGFACTOR ;IS MAG LESS THAN 5? GOTO FIXMAG TSTFSZ MAGFACTOR ; IS MAG 0? GOTO GETBGCRGE FIXMAG MOVLW D'2' MOVWF MAGFACTOR GETBGCRGE MOVLW D'4' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,CHARGEBG ;IF GOOD DATA INITILIZE BACKGROUNG CHARGE WITH EE DATA MOVLW D'179' CPFSGT CHARGEBG GOTO FIXBG MOVLW D'210' CPFSGT CHARGEBG GOTO GETPIMARAMP FIXBG MOVLW D'179' ;IF TOO SMALLOR LARGE FORCE TO NEUTRAL MOVWF CHARGEBG GETPIMARAMP MOVLW D'5' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,PIMARAMPSPEED ;get pimarampspeed MOVLW D'64' CPFSGT PIMARAMPSPEED GOTO GETJOYRAMP MOVLW D'30' MOVWF PIMARAMPSPEED ;INIT PIMA RAMP GETJOYRAMP MOVLW D'6' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYRAMPSPEED ;GET JOYSTICK RAMP SPEED MOVLW D'16' CPFSGT JOYRAMPSPEED GOTO GETABCSET MOVLW D'2' MOVWF JOYRAMPSPEED ;INIT JOYRAMP GETABCSET MOVLW D'25' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,ABCSETPOINT MOVLW D'255' CPFSEQ ABCSETPOINT GOTO GETOPFLAG MOVLW D'69' MOVWF ABCSETPOINT ;IF NOT PROGRAMMED FORCE TO DEFAULT GETOPFLAG MOVLW D'7' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,OPFLAG ;GET OPERATION FLAG MOVLW D'8' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYCONFIG ;GET OPERATION FLAG BTFSC JOYCONFIG,7 ;IF LAST BIT IS SET THIS IS NOT VALID DATA SO CLEAR CLRF JOYCONFIG MOVLW D'9' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYXMAXH MOVLW D'10' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYXMAXL MOVLW D'11' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYXRFMXH MOVLW D'12' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYXRFMXL MOVLW D'13' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYXMINH TSTFSZ JOYXMINH ;IF THE MIN HI IS NOT ZERO, THE EEPROM IS NOT PROGRAMMED BSF JOYCALOK DODANEXT MOVLW D'14' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYXMINL MOVLW D'15' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYXRFMNH MOVLW D'16' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYXRFMNL MOVLW D'17' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYYMAXH MOVLW D'18' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYYMAXL MOVLW D'19' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYYRFMXH MOVLW D'20' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYYRFMXL MOVLW D'21' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYYMINH MOVLW D'22' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYYMINL MOVLW D'23' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYYRFMNH MOVLW D'24' MOVWF EEADDRESS CALL READDATA MOVFF MYEEDATA,JOYYRFMNL MOVFF PIMARAMPSPEED,CPRAMPSPEED ;SET UP RAMP MOVFF JOYXRFMXH,ACCBHI ;ADD PAD TO XRFMX MOVFF JOYXRFMXL,ACCBLO CLRF ACCAHI MOVLW JOYPADVALUE MOVWF ACCALO CALL DOUBLEADD MOVFF ACCBHI,JOYXRFMXH MOVFF ACCBLO,JOYXRFMXL MOVFF JOYXMAXH,ACCBHI ;SUBTRACT PAD FROM XMAX MOVFF JOYXMAXL,ACCBLO CLRF ACCAHI MOVLW JOYPADVALUE MOVWF ACCALO CALL DOUBLESUB MOVFF ACCBHI,JOYXMAXH MOVFF ACCBLO,JOYXMAXL MOVFF JOYXRFMXH,ACCAHI ;CORRECTED XMAX - CORRECTED XRFMX MOVFF JOYXRFMXL,ACCALO ;THIS IS THE FULL UPPER QUADRANT CALL DOUBLESUB ;POSSIBLE RANGE MOVFF ACCBHI,ACCAHI ;MPY x 10 MOVFF ACCBLO,ACCALO CLRF ACCCHI MOVLW D'10' MOVWF ACCCLO CALL MPY16X16 ;ANSWER IN ACCBH/L CLRF ACCAHI ;DIVIDE BY 127 TO GET SCALE FACTOR MOVLW D'127' MOVWF ACCALO CALL DIVIDE MOVFF ACCBLO,JOYXSFU ;SAVE THE X UPPER SCALE FACTOR MOVFF JOYXMINH,ACCBHI ;ADD PAD TO XMIN MOVFF JOYXMINL,ACCBLO CLRF ACCAHI MOVLW JOYPADVALUE MOVWF ACCALO CALL DOUBLEADD MOVFF ACCBHI,JOYXMINH MOVFF ACCBLO,JOYXMINL MOVFF JOYXRFMNH,ACCBHI ;SUB PAD FROM XRFMN MOVFF JOYXRFMNL,ACCBLO CLRF ACCAHI MOVLW JOYPADVALUE MOVWF ACCALO CALL DOUBLESUB MOVFF ACCBHI,JOYXRFMNH MOVFF ACCBLO,JOYXRFMNL MOVFF JOYXMINH,ACCAHI ;CORRECTED XRFMN - CORRECTED XMIN MOVFF JOYXMINL,ACCALO ;THIS IS THE FULL DOWN QUADRANT CALL DOUBLESUB ;POSSIBLE RANGE MOVFF ACCBHI,ACCAHI ;MPY x 10 MOVFF ACCBLO,ACCALO CLRF ACCCHI MOVLW D'10' MOVWF ACCCLO CALL MPY16X16 ;ANSWER IN ACCBH/L CLRF ACCAHI ;DIVIDE BY 127 TO GET SCALE FACTOR MOVLW D'127' MOVWF ACCALO CALL DIVIDE MOVFF ACCBLO,JOYXSFD ;SAVE THE X DOWN SCALE FACTOR MOVFF JOYYRFMXH,ACCBHI ;ADD PAD TO YRFMX MOVFF JOYYRFMXL,ACCBLO CLRF ACCAHI MOVLW JOYPADVALUE MOVWF ACCALO CALL DOUBLEADD MOVFF ACCBHI,JOYYRFMXH MOVFF ACCBLO,JOYYRFMXL MOVFF JOYYMAXH,ACCBHI ;SUB PAD FROM YMAX MOVFF JOYYMAXL,ACCBLO CLRF ACCAHI MOVLW JOYPADVALUE MOVWF ACCALO CALL DOUBLESUB MOVFF ACCBHI,JOYYMAXH MOVFF ACCBLO,JOYYMAXL MOVFF JOYYRFMXH,ACCAHI ;CORRECTED YMAX - CORRECTED YRFMX MOVFF JOYYRFMXL,ACCALO ;THIS IS THE FULL UPPER QUADRANT CALL DOUBLESUB ;POSSIBLE RANGE MOVFF ACCBHI,ACCAHI ;MPY x 10 MOVFF ACCBLO,ACCALO CLRF ACCCHI MOVLW D'10' MOVWF ACCCLO CALL MPY16X16 ;ANSWER IN ACCBH/L CLRF ACCAHI ;DIVIDE BY 127 TO GET SCALE FACTOR MOVLW D'127' MOVWF ACCALO CALL DIVIDE MOVFF ACCBLO,JOYYSFU ;SAVE THE Y UPPER SCALE FACTOR MOVFF JOYYMINH,ACCBHI ;ADD PAD TO YMIN MOVFF JOYYMINL,ACCBLO CLRF ACCAHI MOVLW JOYPADVALUE MOVWF ACCALO CALL DOUBLEADD MOVFF ACCBHI,JOYYMINH MOVFF ACCBLO,JOYYMINL MOVFF JOYYRFMNH,ACCBHI ;SUB PADFROM YRFMN MOVFF JOYYRFMNL,ACCBLO CLRF ACCAHI MOVLW JOYPADVALUE MOVWF ACCALO CALL DOUBLESUB MOVFF ACCBHI,JOYYRFMNH MOVFF ACCBLO,JOYYRFMNL MOVFF JOYYMINH,ACCAHI ;CORRECTED YRFMN - CORRECTED YMIN MOVFF JOYYMINL,ACCALO ;THIS IS THE FULL DOWN QUADRANT CALL DOUBLESUB ;POSSIBLE RANGE MOVFF ACCBHI,ACCAHI ;MPY x 10 MOVFF ACCBLO,ACCALO CLRF ACCCHI MOVLW D'10' MOVWF ACCCLO CALL MPY16X16 ;ANSWER IN ACCBH/L CLRF ACCAHI ;DIVIDE BY 127 TO GET SCALE FACTOR MOVLW D'127' MOVWF ACCALO CALL DIVIDE MOVFF ACCBLO,JOYYSFD ;SAVE THE Y DOWN SCALE FACTOR MOVLW D'2' MOVWF TMP1 MOVLW D'8' ;SET UP TEMP COUNTER MOVWF TMP0 MOVLW B'00000001' ;Bootup display pattern (version number) MOVWF AMPPORT STABILIZE2 BTFSS SEC.125FLG GOTO STABILIZE2 BCF SEC.125FLG DECFSZ TMP1 GOTO STABILIZE2 MOVLW D'1' MOVWF TMP1 BCF STATUS,C RLNCF AMPPORT,F DECFSZ TMP0 GOTO STABILIZE2 CALL DOCONVERSIONS ; GET STARTING VALUES CLRF TMP1 CALL ASSISTLIMITSET RETURN ;********************************************************************** ;16 BIT ADD AND SUBTRACT ROUTINE RESULT RETURNED IN ACCBHI AND ACCBLO ; the number to be subtracted from is put in accB Hi and LO ;********************************************************************** DOUBLESUB CALL NEG_A DOUBLEADD MOVF ACCALO,W ADDWF ACCBLO BTFSC STATUS,C INCF ACCBHI MOVF ACCAHI,W ADDWF ACCBHI RETURN NEG_A COMF ACCALO INCF ACCALO BTFSC STATUS,Z DECF ACCAHI COMF ACCAHI RETURN NEG_B COMF ACCBLO INCF ACCBLO BTFSC STATUS,Z DECF ACCBHI COMF ACCBHI RETURN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; 16x16 Bit Unsigned Fixed Point Multiply 16 x 16 -> 32 ; ; Input: 16 bit unsigned fixed point multiplicand in ACCALO, ACCAHI ; 16 bit unsigned fixed point multiplier in ACCCLO, ACCCHI ; ; Use: CALL MPY16X16 ; ; Output: 32 bit unsigned fixed point product in ACCAHI, ACCALO, ACCBHI, ACCBLO ; ; Result: ACCA+ACCB <-- ACCA * ACCC ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MPY16X16 MOVFF ACCALO,TMP1 MOVF ACCALO,W MULWF ACCCLO MOVFF PRODH,ACCBHI MOVFF PRODL,ACCBLO MOVF ACCAHI,W MULWF ACCCHI MOVFF PRODH,ACCAHI MOVFF PRODL,ACCALO MULWF ACCCLO MOVF PRODL,W ADDWF ACCBHI,F MOVF PRODH,W ADDWFC ACCALO,F CLRF WREG ADDWFC ACCAHI,F MOVF TMP1,W MULWF ACCCHI MOVF PRODL,W ADDWF ACCBHI,F MOVF PRODH,W ADDWFC ACCALO,F CLRF WREG ADDWFC ACCAHI,F RETURN ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;16bit divide routine ACCB/ACCA ;ACCAHI AND ACCALO HOLD DENOMINATOR, ACCBHI AND ACCBLO HOLD NUMERATOR ;RESULT IN ACCBHI AND ACCBLO, REMAINDER IN ACCCHI AND ACCCLO ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DIVIDE CALL DIVSET CLRF ACCCHI CLRF ACCCLO DLOOP BCF STATUS,C RLCF ACCDLO,1 RLCF ACCDHI,1 RLCF ACCCLO,1 RLCF ACCCHI,1 MOVF ACCAHI,0 SUBWF ACCCHI,0 ;CK IF A>C BTFSS STATUS,Z GOTO NOCHK MOVF ACCALO,0 SUBWF ACCCLO,0 ;IF MSB = THEN CK LSB NOCHK BTFSS STATUS,C ;CARRY SET IF C>A GOTO NOGO MOVF ACCALO,0 ;C-A INTO C SUBWF ACCCLO,1 BTFSS STATUS,C DECF ACCCHI,1 MOVF ACCAHI,0 SUBWF ACCCHI,1 BSF STATUS,C ;SHIFT A 1 INTO B(RESULT) NOGO RLCF ACCBLO,1 RLCF ACCBHI,1 ;LOOP UNTIL ALL BITS CHECKED DECFSZ TMP0,1 GOTO DLOOP RETURN DIVSET MOVLW 0X10 ;FOR 16 SHIFTS MOVWF TMP0 MOVF ACCBHI,0 ;MOVE ACCB TO ACCD MOVWF ACCDHI MOVF ACCBLO,0 MOVWF ACCDLO CLRF ACCBHI CLRF ACCBLO RETURN ;**************************************************** ;WRITES DATA TO EEPROM ;*************************************************** CBLOCK WRITECOUNTER READCOUNTER ENDC WRITEDATA MOVF EEADDRESS,W ;SET UP THE ADDRESS TO WRITE MOVWF EEADR ;DATA MEM ADDRESS MOVF MYEEDATA,W ;GET DATA IN W FOR WRITE MOVWF EEDATA BCF EECON1,EEPGD ;POINT TO DATA MEMORY BCF EECON1,CFGS ; ACCESS DATA EEPROM BSF EECON1,WREN ;ENABLE WRITES BCF INTCON,GIE ;DISABLE INTERUPTS MOVLW H'55' MOVWF EECON2 ;WRITE 55H MOVLW H'AA' MOVWF EECON2 ;WRITE AAH BSF EECON1,WR ;SET WR BIT TO START WRITE BSF INTCON,GIE ;REENABLE INTERUPTS CKDONE BTFSC EECON1,WR GOTO CKDONE BCF EECON1,WREN INCF WRITECOUNTER RETURN ;**************************************************** ;READS DATA FROM EEPROM ;*************************************************** READDATA MOVF EEADDRESS,W ;GET ADDRESS MOVWF EEADR ;SEND TO EEADR BCF EECON1,EEPGD BCF EECON1,CFGS BSF EECON1,RD MOVF EEDATA,W MOVWF MYEEDATA ;data from eeprom INCF READCOUNTER RETURN end