Untitled
unknown
plain_text
8 months ago
55 kB
5
Indexable
#include <iom162.h>
#include <ina90.h>
#include <stdio.h>
#include <string.h>
#include "Flash_AT26DF161.h"
#include "TTSerial.h" // Define PS021 register settings
// Select which Tool Serial number this is
// in order to load the correct set of PS021 regisers
//unsigned char reg_data[16][4];
ps021Regs_ ps021reg;
// Statoil Torque Counter runs without RCU.
// Uses extra connector to short circuit pin 13 on TorqueCounter card
// - This forces the Taring in this mode, note that the same connector
// also turns on the torque counter so we need to wait some time
// in order for the readings to stabilize, before accepting the
// tara value.
// The NO_RCU_MODE define controls wether this functionality is implemented
//#define TESTING_NORCU
// LED defines
#define DISP_CS
#define Digit0_turn 0x23
#define Digit1_turn 0x22
#define Digit2_turn 0x21
#define Digit3_turn 0x20
#define Digit0_torque 0x27
#define Digit1_torque 0x26
#define Digit2_torque 0x25
#define Digit3_torque 0x24
// State LED defines
#define Comp_1 0x04
#define Comp_2 0x08
#define High 0x01
#define Low 0x02
//#define RS485_Mode (PORTG|=0x02) //(1 << PC1)
#define RS232_Mode (PORTC&=0xFD) //(0 << PC1)
//#define RS485_drive_enable (PORTC|=0x01) //(1 << PC0)
//#define RS485_drive_disable (PORTC&=0xFE) //(0 << PC0)
// Communications defines
// TC = TurnsCounter
// TT = TorqueTool
#define TCVAL 0x10
#define TCRETCONF 0x30
#define TCGVAL 0x20
#define TCSVAL 0x90
#define TCRESET 0x40
#define TCSETCONF 0x60
#define TCREQCONF 0x80
#define TTVAL 0x14
#define TTRETCONF 0x34
#define TTGVAL 0x24
#define TTSVAL 0x94
#define TTRESET 0x44
#define TTSETCONF 0x64
#define TTREQCONF 0x84
#define _RQMODE 0x50 // Toggle request mode (only send count value if requested)
// Communication format ids
#define _STX 0xAA
#define _ETX 0x55
// EEPROM defines
#define CONFIG_DATA_START_REGISTER 0x10
#define TORQUE_CONFIG_DATA_START_REGISTER 0x30
// The message protocol
// We have four messages of which two only differ in cmd id.
// TCVAL is FROM TC
// TCGVAL, TCSVAL, TCRESET and TCCONF is TO TC
// Send Turns counter value and torque value
typedef struct {
unsigned char start; // TCSTX
unsigned char cmd; // TCVAL
int turnsValue; // Current Turns counter value, 0 = UINT_MAX/2
int torqueValue; // Current raw torque value
unsigned char flags; // status flage
unsigned char end; // TCETX
} TC_Value_; // 7 bytes
// Request Turns counter value and Reset message
typedef struct {
unsigned char start; // TCSTX
unsigned char cmd; // TCRESET, TCGVAL or TCRGR
unsigned char end; // TCETX
} TC_Cmd_; // 3 bytes
// Configuration message
typedef struct {
unsigned char start; // TCSTX
unsigned char cmd; // TCCONF
float ratio; // Number of pulses per turn multiplied with gear ratio
unsigned char end; // TCETX
} TC_Configuration_; // 7 bytes
typedef struct {
unsigned char start; // TCSTX
unsigned char cmd; // TCCONF
unsigned char idx; // Index in EEPROM of this item
long scaledVal; // int value, stored by topside application
long lVal; // int value, fetched from current raw value
unsigned char end; // TCETX
} TT_Configuration_; // 12 bytes
/*
typedef struct {
unsigned char start; // TCSTX
unsigned char cmd; // TTCONF
unsigned char idx; // Index in EEPROM of this item - idx = 0 => lVal gives count items stored
long scaledVal;
unsigned char end; // TCSTX
} TT_Configuration_Rx_; // 8 bytes
*/
#define false 0
#define true !false
// Variables to hold current messages
TC_Configuration_ tcConf;
TT_Configuration_ tqConf;
TC_Value_ tcVal;
//TT_Configuration_Rx_ tqRxCnf;
#define MSG_MAX_LEN 10
unsigned char Tx[MSG_MAX_LEN], Rx[MSG_MAX_LEN];
unsigned char Ex_power, Itf_box;
unsigned char rxIdx, txIdx;
unsigned char txSize;
unsigned char oldFlags;
unsigned char receivingMsg = false;
#ifdef NO_RCU_MODE
unsigned char ForceTaring;
unsigned char DoneTaring = 0x0;
long ForceWaitCount = 0;
#endif
// Logging of torque, turns and timestamp
unsigned char logPointer[3]; // Address of next data to log
unsigned char logStart[3] = {0x00, 0x01, 0x00}; // First position used for log data
unsigned char logEnd[3] = {0x1f, 0xff, 0xff}; // Last position used for log data
// Filter Torque readings
int torqueRawIdx = 0;
int torqueReadCount = 0;
#define TORQUE_AVG_COUNT 200
int torqueRaw[TORQUE_AVG_COUNT];
long lTmp;
char useSplitFilter; // boolean test, use Split Filter or Average Filter
// Scaling of torque values
char useScaling; // boolean Use Scaling or just display raw values
typedef struct {
long rawIn; // raw input value
long scaledOut; // corresponding output value
} TorqueConfig_;
#define TORQUE_SCALEPAIR_COUNT 20
#ifdef NOEEPROM
int countTTConfIdx = 12; // Hardcoded - should match number of used points
#if SERIAL_NO == 10
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
/* raw, scaled */
{ -2938, -2700},
{ -2579, -2355},
{ -1733, -1573},
{ -891, -817},
{ -263, -254},
{ -29, -31},
{ 46, 31},
{ 326, 271},
{ 996, 865},
{ 1801, 1543},
{ 2735, 2374},
{ 3150, 2744},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0}
};
#endif
#if SERIAL_NO == 11
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
/* raw, scaled */
{ -2984, -2699},
{ -2553, -2309},
{ -1689, -1526},
{ -903, -811},
{ -293, -256},
{ -26, -33},
{ 47, 34},
{ 287, 257},
{ 963, 849},
{ 1772, 1562},
{ 2669, 2339},
{ 3109, 2734},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0}
};
#endif
#if SERIAL_NO == 12
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
/* raw, scaled */
{ -2938, -2700},
{ -2579, -2355},
{ -1733, -1573},
{ -891, -817},
{ -263, -254},
{ -29, -31},
{ 46, 31},
{ 326, 271},
{ 996, 865},
{ 1801, 1543},
{ 2735, 2374},
{ 3150, 2744},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0}
};
#endif
#if SERIAL_NO == 13
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
/* raw, scaled */
{ -2938, -2700},
{ -2579, -2355},
{ -1733, -1573},
{ -891, -817},
{ -263, -254},
{ -29, -31},
{ 46, 31},
{ 326, 271},
{ 996, 865},
{ 1801, 1543},
{ 2735, 2374},
{ 3150, 2744},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0}
};
#endif
#if SERIAL_NO == 14
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
/* raw, scaled */
{ -2900, -2692},
{ -2411, -2238},
{ -1520, -1490},
{ -843, -862},
{ -241, -273},
{ -13, -28},
{ 53, 30},
{ 274, 249},
{ 947, 854},
{ 1710, 1545},
{ 2538, 2300},
{ 3010, 2645},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0}
};
#endif
#if SERIAL_NO == 15
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
/* raw, scaled */
{ -2938, -2700},
{ -2579, -2355},
{ -1733, -1573},
{ -891, -817},
{ -263, -254},
{ -29, -31},
{ 46, 31},
{ 326, 271},
{ 996, 865},
{ 1801, 1543},
{ 2735, 2374},
{ 3150, 2744},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0}
};
#endif
#if SERIAL_NO == 16
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
/* raw, scaled */
{ -3017, -2702},
{ -2562, -2287},
{ -1669, -1491},
{ -955, -828},
{ -324, -254},
{ -41, -29},
{ 24, 29},
{ 288, 248},
{ 975, 818},
{ 1826, 1550},
{ 2694, 2352},
{ 3099, 2695},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0}
};
#endif
#if SERIAL_NO == 17
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
/* raw, scaled */
{ -2938, -2700},
{ -2579, -2355},
{ -1733, -1573},
{ -891, -817},
{ -263, -254},
{ -29, -31},
{ 46, 31},
{ 326, 271},
{ 996, 865},
{ 1801, 1543},
{ 2735, 2374},
{ 3150, 2744},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0}
};
#endif
#if SERIAL_NO == 18
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
/* raw, scaled */
{ -2938, -2700},
{ -2579, -2355},
{ -1733, -1573},
{ -891, -817},
{ -263, -254},
{ -29, -31},
{ 46, 31},
{ 326, 271},
{ 996, 865},
{ 1801, 1543},
{ 2735, 2374},
{ 3150, 2744},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0}
};
#endif
#if SERIAL_NO == 19
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
/* raw, scaled */
{ -2938, -2700},
{ -2579, -2355},
{ -1733, -1573},
{ -891, -817},
{ -263, -254},
{ -29, -31},
{ 46, 31},
{ 326, 271},
{ 996, 865},
{ 1801, 1543},
{ 2735, 2374},
{ 3150, 2744},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0}
};
#endif
#if SERIAL_NO == 20
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
/* raw, scaled */
{ -2938, -2700},
{ -2579, -2355},
{ -1733, -1573},
{ -891, -817},
{ -263, -254},
{ -29, -31},
{ 46, 31},
{ 326, 271},
{ 996, 865},
{ 1801, 1543},
{ 2735, 2374},
{ 3150, 2744},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0}
};
#endif
#if SERIAL_NO == 21
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
/* raw, scaled */
{ -2938, -2700},
{ -2579, -2355},
{ -1733, -1573},
{ -891, -817},
{ -263, -254},
{ -29, -31},
{ 46, 31},
{ 326, 271},
{ 996, 865},
{ 1801, 1543},
{ 2735, 2374},
{ 3150, 2744},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0}
};
#endif
#if SERIAL_NO == 22
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
/* raw, scaled */
{ -2938, -2700},
{ -2579, -2355},
{ -1733, -1573},
{ -891, -817},
{ -263, -254},
{ -29, -31},
{ 46, 31},
{ 326, 271},
{ 996, 865},
{ 1801, 1543},
{ 2735, 2374},
{ 3150, 2744},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0},
{ 0, 0}
};
#endif
#if SERIAL_NO == 99
/* Basic configuration */
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT] = {
{ 0, 0},{ 5, 5},{10,10},{15,15},{20,20},
{25,25},{30,30},{35,35},{40,40},{45,45},
{50,50},{55,55},{60,60},{65,65},{70,70},
{75,75},{80,80},{85,85},{90,90},{95,95}
};
#endif
#else
TorqueConfig_ ttConf[TORQUE_SCALEPAIR_COUNT]; // maximum 10 TorqueConfig_ pairs
int countTTConfIdx; // Number of TT Configurations, stored at idx 0
#endif
// used in readTorque function
long scaledValue;
long lastScaledValue;
char useMultiCalPoints;
char newVal = false;
int lowerIdx;
int upperIdx;
double deltaRaw;
double deltaScaled;
double deltaOffset;
double rawValue;
double tmpRaw;
double _a_;
double _b_;
//int countTTConfIdx; // Number of TT Configurations, stored at idx 0
int lastTTConfIdx;
/*
// Defined in ATF26DF161.h
typedef struct {
int time; // for now 1000
int torque; // value from display
int turns; // value from display
} LogDataBlock_; // 6 bytes
*/
LogDataBlock_ logDataBlock;
LogDataBlock_ lastlogDataBlock; // last item stored to flash
unsigned char digits [13]= {0x7E, /* 0 */
0x30, /* 1 */
0x6D, /* 2 */
0x79, /* 3 */
0x33, /* 4 */
0x5B, /* 5 */
0x5F, /* 6 */
0x70, /* 7 */
0x7F, /* 8 */
0x7B, /* 9 */
0x7C, /* L */
0x5C, /* o */
0x38}; /* b */
char ASCII [11] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.'};
char next_state, last_state;
unsigned char decimal, ones, tens, hundreds;
unsigned long power_down;
int intervalWriteCom;
unsigned char toggle;
unsigned long irqCount;
#define valIdx 0
#define rawIdx 1
#define lastRawIdx 2
#define pulsIdx 3
#define oldpulsIdx 4
#define torqueTarIdx 3
#define valTaredIdx 4
#define valBeforeScaledIdx 5
#define valScaledIdx 6
// Contains all input data
// raw and scaled values
typedef struct {
long turns[5];
long torque[7];
} SensorInput_;
SensorInput_ inp;
#define reqValIdx 0
#define reqConfIdx 1
#define storeConfIdx 2
#define minusIdx 3
char turnsCmd[4];
char torqueCmd[4];
unsigned char Data_Flash, dummy;
//unsigned char updateTorqueLed;
//char bReqValue = false; // turnsCmd[reqVal]
//char bReqConf = false; // turnsCmd[reqConf]
//char bStoreCnf = false; // turnsCmd[storeConf]
char bOnChangeMode = true; // default to transmit value onChange mode
char bDoTara = false;
signed char matrise[4][4] = {{0, 1, -1, 0},
{-1, 0, 0, 1},
{1, 0, 0, -1},
{0, -1, 1 ,0}};
//////////////////////
// Function prototypes
//////////////////////
void Write_Display(unsigned char Disp_data_H, unsigned char Disp_data_L);
void initHW(void);
unsigned char readCom(void);
unsigned char writeCom(void);
void checkPower(void);
void activateCom(void);
void powerDown(void);
void updateTurnsLED(void);
void updateTorqueLED(void);
void loadTurnsConfig(void);
void storeTurnsConfig(void);
#ifndef NOEEPROM
void loadTorqueConfig(void);
void storeTorqueConfig(void);
#endif
// Added from ToolControl\test.c 20070130 - so
void operation_mode_PS021(unsigned op_code);
void read_PS021(unsigned op_code);
void write_PS021(unsigned char op_code, unsigned char byte0, unsigned char byte1, unsigned char byte2);
void readTorque();
void readTorque2();
void scaleTorque();
void scaleTorque2();
void scaleTorque3();
void readFlags();
void writeLog();
//unsigned char valueChanged();
#ifdef NO_RCU_MODE
void checkForceTaring(void);
#endif
//////////////////////
// Interrupt handlers
//////////////////////
#pragma vector=INT0_vect
__interrupt void INT0_interrupt()
{
}
#pragma vector=INT1_vect
__interrupt void INT1_interrupt()
{
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//*Timer/counter 1 interrupt compare match. With 16MHz clock, this interupt will be executed every:
//*Ex-time = 1/16MHz*256*16 = 409.6us.
/////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma vector=TIMER1_COMPA_vect
__interrupt void TIMER1_COMPA_interrupt()
{
/* Sample PortD at xxxHz*/
/* CPU runs at 16MHz = 16*1000*1000 = 16000000 Hz */
/* Interrupt is clkIO/256 => 16MHz/256 = 62500 Hz */
/* A counter here increments turns every second*/
// Read Turns Count
next_state = PIND;
next_state^= 0x0C;
next_state&= 0x0C;
next_state>>= 2;
if(last_state != next_state)
{
inp.turns[rawIdx] = inp.turns[rawIdx] + matrise[last_state][next_state];
inp.turns[valIdx] = inp.turns[rawIdx] * 100 / 872;
/* 4 count on one magnet detection, 4 magnets on the weel */
/* The gear is 1/5,45 (29,75),(29,83). */
/* Count=4*4*5,45=87.2 (476),(477,78) count/rotation of the shaft */
/* One rotation shall give 10 count, 1,0 on the display. */
tcVal.turnsValue = (int)inp.turns[valIdx];
turnsCmd[minusIdx] = inp.turns[valIdx] < 0;
inp.turns[valIdx] *= ((turnsCmd[minusIdx]) ? -1 : 1);
last_state = next_state;
power_down = 0;
}
else
{
power_down++;
}
// interrupt test - inc counter every second
// irqCount++;
// if(62500 < irqCount)
// {
// logDataBlock.time++;
// irqCount = 0;
// }
// turns[valIdx] = logDataBlock.time;
}
void main(void)
{
int i;
irqCount = 0;
txSize = 0;
toggle = 0;
intervalWriteCom = 0; // Try to force sending with interval if nothing has happened for a while
tcVal.start = _STX;
tcVal.cmd = TCVAL;
tcVal.end = _ETX;
tcConf.start = _STX;
tcConf.ratio = ((16*5.45)*10); // default value
tcConf.end = _ETX;
tqConf.start = _STX;
tqConf.scaledVal = 0;
tqConf.lVal = .0;
tqConf.end = _ETX;
turnsCmd[reqValIdx] = false;
turnsCmd[reqConfIdx] = false;
turnsCmd[storeConfIdx] = false;
logDataBlock.address[0] = logStart[0];
logDataBlock.address[1] = logStart[1];
logDataBlock.address[2] = logStart[2];
logDataBlock.time = 0;
logDataBlock.torque = 0;
logDataBlock.turns = 0;
lastlogDataBlock.time = 0;
lastlogDataBlock.torque = 0;
lastlogDataBlock.turns = 0;
inp.torque[torqueTarIdx] = 0;
// updateTorqueLed = true;
initHW();
initPS021Regs( &ps021reg, SERIAL_NO );
// Added from ToolControl\test.c 20071030 - so
// block start
//Power On Reset
operation_mode_PS021(0x50);
//PS021 Init Registers
for(i=0;i<15;i++)
{
write_PS021(ps021reg.reg[i][0],ps021reg.reg[i][1],ps021reg.reg[i][2],ps021reg.reg[i][3]);
};
//Init
operation_mode_PS021(0xC0);
write_Config_Flash(0x06);
write_Status_Flash(0x01, 0x02);
write_Config_Flash(0x06);
read_Status_Flash(0x05);
write_Data_Flash(0x02, 0x00, 0x00, 0x04, 0x22);
while(Data_Flash & 0x01)
read_Status_Flash(0x05); //While busy
// block end
__delay_cycles(5);
loadTurnsConfig();
#ifndef NOEEPROM
/******************************************
* Read torque configuration from EEPROM
**/
__delay_cycles(5);
lastTTConfIdx = 0;
loadTorqueConfig(); // Get countTTConfIdx
__delay_cycles(5);
for(i=1; i < countTTConfIdx; i++ )
{
lastTTConfIdx = i; // Increment pointer
loadTorqueConfig(); // Get config value at position lastTTConfIdx
__delay_cycles(5);
}
#endif
lastTTConfIdx = 0;
__delay_cycles(5);
Write_Display(0x04,0x01); //Configuration
Write_Display(0x01,0x00); //Decode mode
Write_Display(0x02,0x00); //Intensity
Write_Display(0x03,0x07); //scan Limit
//Write_Display(0x07,0x01); //Display test
// Set Average Torque values to zero
for(i=0; i<TORQUE_AVG_COUNT; i++)
{
torqueRaw[i] = 0;
}
// Set default operation
useSplitFilter = false; // Filter Torque using SplitFilter or Average Filter
useScaling = true; // Scale torque values or just display raw readings
useMultiCalPoints = true; // Scale using only two values ore ttConf arrary
operation_mode_PS021(0x01); // Start new measurement
#ifdef NO_RCU_MODE
ForceWaitCount = 0;
#endif
_SEI(); // Enable interupt
while (1)
{
readFlags();
checkPower();
#ifdef NO_RCU_MODE
checkForceTaring();
#endif
//#else
writeCom();
readCom();
//#endif
updateTurnsLED();
if(500 < intervalWriteCom )
{
updateTorqueLED();
writeLog();
}
powerDown();
// activateCom();
if(turnsCmd[storeConfIdx])
storeTurnsConfig();
#ifndef NOEEPROM
if(torqueCmd[storeConfIdx])
storeTorqueConfig();
#endif
newVal = false;
if(false == receivingMsg)
{
//torqueReadCount = torqueRawIdx;
if(0 == intervalWriteCom%3)
{
readTorque2();
}
}
if( 500 < intervalWriteCom)
{
intervalWriteCom = 0;
}
intervalWriteCom++;
}
}
void readFlags()
{
tcVal.flags = 0x0; // clear
// Check Status Lights
if(!(PINA & Comp_1))
{
tcVal.flags |= Comp_1;
PORTA&= 0x7F;
}
else
{
PORTA|= 0x80;
}
if(!(PINA & Comp_2))
{
tcVal.flags |= Comp_2;
PORTA&= 0xBF;
}
else
{
PORTA|= 0x40;
}
#ifndef TESTING_NORCU
if(!(PINA & High))
{
tcVal.flags |= High;
PORTA&= 0xDF;
}
else
{
PORTA|= 0x20;
}
// Use Low status to check if we're able to turn on or off the pin
if(!(PINA & Low))
{
tcVal.flags |= Low;
PORTA&= 0xEF;
}
else
{
PORTA|= 0x10;
}
#endif
}
void scaleTorque()
{
int k;
inp.torque[valBeforeScaledIdx] = inp.torque[valTaredIdx];
rawValue = inp.torque[valBeforeScaledIdx];
useMultiCalPoints = true; // Select whether to use 2 points or several points
if(false == useMultiCalPoints)
{
// NOTE These values are approximates
if(0 < rawValue)
{
// Negative axis, but the number in rawValue is positive
scaledValue = (int)(rawValue * 4.376950895);
}
else
{
// NOTE
// Positive axis, but the number in rawValue is negative
scaledValue = (int)(rawValue * 4.12553271);
}
}
else
{
// Must get limits at either side of rawValue
// check if value is positive
// Note this value is inverted (negative results in positive)
tmpRaw = rawValue * -1;
if(0 < rawValue)
{
// Negative axis, but the number in rawValue is positive
upperIdx = 0; // Set both to lowest calibration point
lowerIdx = 1;
// Locate limit below and abov rawvalue
// values are:
// idx 0 => lowest negative calibration point
// idx countTTConfIdx -1 => highest positive calibration point
for(k = 0; k < countTTConfIdx; k++)
{
if( tmpRaw >ttConf[k].rawIn)
{
// Select points at either side of tmpRaw
lowerIdx = k+1;
upperIdx = k;
}
}
if(lowerIdx >= countTTConfIdx-1)
{
lowerIdx = countTTConfIdx-1; // last possible index
}
}
else
{
// Positive axis, but the number in rawValue is negative
upperIdx = countTTConfIdx -1; // Set both to highest calibration point
lowerIdx = upperIdx -1;
// Locate limit below and abov rawvalue
// values are:
// idx 0 => highest positive calibration point
// idx countTTConfIdx -1 => lowest negative calibration point
for(k = countTTConfIdx -1; k > -1; k--) // Step down from last position
{
if( tmpRaw < ttConf[k].rawIn)
{
upperIdx = k;
lowerIdx = k-1;
}
}
if(lowerIdx <= 0)
{
lowerIdx = 0; // first possible index
}
}
// Linear scaling
deltaRaw = ttConf[upperIdx].rawIn - ttConf[lowerIdx].rawIn;
deltaScaled = ttConf[upperIdx].scaledOut - ttConf[lowerIdx].scaledOut;
deltaOffset = ( ttConf[lowerIdx].scaledOut * ttConf[upperIdx].rawIn ) -
( ttConf[upperIdx].scaledOut * ttConf[lowerIdx].rawIn);
// Note: If value is outside calibration points, get factor from outer point only
if(0 == deltaRaw)
{
deltaRaw = ttConf[upperIdx].rawIn;
}
if(0 == deltaScaled)
{
deltaScaled = ttConf[upperIdx].scaledOut;
}
_a_ = (deltaScaled / deltaRaw);
_b_ = (deltaOffset / (deltaRaw));
scaledValue = (long)((_a_ * rawValue) + _b_);
}
inp.torque[valScaledIdx] = scaledValue;
}
void scaleTorque2()
{
int k;
inp.torque[valBeforeScaledIdx] = inp.torque[valTaredIdx];
rawValue = inp.torque[valBeforeScaledIdx];
useMultiCalPoints = true; // Select whether to use 2 points or several points
if(false == useMultiCalPoints)
{
// NOTE These values are approximates
if(0 < rawValue)
{
// Negative axis, but the number in rawValue is positive
scaledValue = (int)(rawValue * 4.376950895);
}
else
{
// NOTE
// Positive axis, but the number in rawValue is negative
scaledValue = (int)(rawValue * 4.12553271);
}
}
else
{
// Must get limits at either side of rawValue
// Locate limit below and abov rawvalue
// values are:
// idx 0 => highest positive calibration point
// idx countTTConfIdx -1 => lowest negative calibration point
// invert all values ---
upperIdx = 0; // Set both to lowest calibration point
lowerIdx = 1;
for(k = 0; k < countTTConfIdx; k++)
{
if( rawValue < ttConf[k].rawIn )
{
// Select points at either side of tmpRaw
upperIdx = k;
lowerIdx = k+1;
if(lowerIdx == countTTConfIdx)
{
// Keep within range
lowerIdx--;
upperIdx--;
}
// let loweidx be the smallest value
if(ttConf[lowerIdx].rawIn > ttConf[upperIdx].rawIn)
{
// swap
upperIdx = k+1;
lowerIdx = k;
}
if(upperIdx == countTTConfIdx)
{
// Keep within range
lowerIdx--;
upperIdx--;
}
}
}
// Linear scaling
deltaRaw = (ttConf[upperIdx].rawIn) - (ttConf[lowerIdx].rawIn);
deltaScaled = (ttConf[upperIdx].scaledOut) - (ttConf[lowerIdx].scaledOut);
deltaOffset = ( ttConf[lowerIdx].scaledOut * ttConf[upperIdx].rawIn) -
( ttConf[upperIdx].scaledOut * ttConf[lowerIdx].rawIn);
// Note: If value is outside calibration points, get factor from outer point only
if(0 == deltaRaw)
{
deltaRaw = ttConf[upperIdx].rawIn;
}
_a_ = (deltaScaled / deltaRaw);
_b_ = (deltaOffset / deltaRaw);
scaledValue = (long)((_a_ * rawValue) + _b_);
}
inp.torque[valScaledIdx] = scaledValue;
}
void scaleTorque3()
{
int k;
//int tmp;
inp.torque[valBeforeScaledIdx] = inp.torque[valTaredIdx];
rawValue = inp.torque[valBeforeScaledIdx];
// Must get limits at either side of rawValue
// Locate limit below and abov rawvalue
upperIdx = 0; // Set both to lowest calibration point
lowerIdx = 1;
for(k = 0; k < countTTConfIdx; k++)
{
if( inp.torque[valBeforeScaledIdx] > ttConf[k].rawIn )
{
// Select points at either side of tmpRaw
upperIdx = k;
lowerIdx = k+1;
}
else
{
break;
}
}
if(lowerIdx == countTTConfIdx)
{
// Keep within range
lowerIdx--;
upperIdx--;
}
// Linear scaling
deltaRaw = (ttConf[upperIdx].rawIn) - (ttConf[lowerIdx].rawIn);
deltaScaled = (ttConf[upperIdx].scaledOut - ttConf[lowerIdx].scaledOut);
deltaOffset = ( ttConf[lowerIdx].scaledOut * ttConf[upperIdx].rawIn) -
( ttConf[upperIdx].scaledOut * ttConf[lowerIdx].rawIn);
// Note: If value is outside calibration points, get factor from outer point only
if(0 == deltaRaw)
{
deltaRaw = ttConf[upperIdx].rawIn;
}
_a_ = (deltaScaled / deltaRaw);
_b_ = (deltaOffset / deltaRaw);
scaledValue = (long)((_a_ * (rawValue)) + _b_);
inp.torque[valScaledIdx] = scaledValue;
lastScaledValue = scaledValue;
}
// Read Torque
void readTorque2()
{
int k;
long tmpTorque = 0;
if(!(PINC & 0x40))
{
read_PS021(0xB0); // Updates inp.torque[rawIdx]
operation_mode_PS021(0x01); // Start new measurement
}
// Test with values
//inp.torque[rawIdx] = 300;
// Invert the value
// tmpTorque = inp.torque[rawIdx] * -1;
// inp.torque[rawIdx] = tmpTorque;
// Use average filter
torqueRaw[torqueRawIdx] = inp.torque[rawIdx];
lTmp = 0;
for(k=0; k<TORQUE_AVG_COUNT; k++)
{
lTmp += torqueRaw[k];
}
// inp.torque[valIdx] = (int)(( lTmp / TORQUE_AVG_COUNT) * -1);
inp.torque[valIdx] = (int)( lTmp / TORQUE_AVG_COUNT);
// Invert torque value
tmpTorque = inp.torque[valIdx];
tmpTorque = tmpTorque -1;
tmpTorque = ~tmpTorque;
inp.torque[valIdx] = tmpTorque;
torqueRawIdx++;
if(TORQUE_AVG_COUNT <= torqueRawIdx )
{
torqueRawIdx = 0;
}
if(true == bDoTara)
{
// set tara value
inp.torque[torqueTarIdx] = inp.torque[valIdx];
inp.torque[valTaredIdx] = 0;
bDoTara = false;
}
else
{
// subtract tara value
// inp.torque[valTaredIdx] = inp.torque[torqueTarIdx] - inp.torque[valIdx];
inp.torque[valTaredIdx] = inp.torque[valIdx] - inp.torque[torqueTarIdx];
}
useScaling = ((0 == countTTConfIdx) ? false : true) ;
if(true == useScaling)
{
scaleTorque3();
}
else // if( true == useScaling )
{
// just transfer raw values
inp.torque[valScaledIdx] = inp.torque[valTaredIdx];
}
if((0 == countTTConfIdx))
{
// just transfer raw values
inp.torque[valScaledIdx] = inp.torque[valTaredIdx];
}
}
// Read Torque
void readTorque()
{
int splitfactor;
splitfactor = 200;
int k;
if(!(PINC & 0x40))
{
read_PS021(0xB0); // Updates inp.torque[rawIdx]
newVal = true;
}
operation_mode_PS021(0x01);
if(true == newVal)
{
newVal = false;
useSplitFilter = false;
if(true == useSplitFilter)
{
// reduce flicker in display
inp.torque[valIdx] = (int)(
(
( inp.torque[valIdx] * (splitfactor -1) ) + (inp.torque[rawIdx] * 1)
) / splitfactor
);
}
else
{
// Use average filter
torqueRaw[torqueRawIdx] = inp.torque[rawIdx];
lTmp = 0;
for(k=0; k<TORQUE_AVG_COUNT; k++)
{
lTmp += torqueRaw[k];
}
inp.torque[valIdx] = (int)( lTmp / TORQUE_AVG_COUNT);
torqueRawIdx++;
if(TORQUE_AVG_COUNT <= torqueRawIdx )
{
torqueRawIdx = 0;
}
}
if(true == bDoTara)
{
// set tara value
inp.torque[torqueTarIdx] = inp.torque[valIdx];
inp.torque[valTaredIdx] = 0;
bDoTara = false;
}
else
{
// subtract tara value
inp.torque[valTaredIdx] = inp.torque[torqueTarIdx] - inp.torque[valIdx];
}
useScaling = ((0 == countTTConfIdx) ? false : true) ;
if(true == useScaling)
{
scaleTorque3();
}
else // if( true == useScaling )
{
// just transfer raw values
inp.torque[valScaledIdx] = inp.torque[valTaredIdx];
}
}
}
void writeLog()
{
unsigned char *pData;
unsigned char idx;
// Get new timestamp from Real Time Clock
logDataBlock.time++;
// compare Timestamp, if equal or greater write log
// and update address for next write operation
if(((lastlogDataBlock.time + 1) <= logDataBlock.time) )
{
// First three items are just address - skip pointer past these
pData = (unsigned char*)&logDataBlock.time; // Set pointer to first item in block
for(idx = 0; idx < (sizeof(LogDataBlock_)-3); idx++) // address is three bytes
{
// write Log data to flash
write_Data_Flash(0x02,
logDataBlock.address[0],
logDataBlock.address[1],
logDataBlock.address[2] + idx,
*pData);
}
// set next position
logDataBlock.address[2] += idx;
// copy written data to lastLog
lastlogDataBlock.time = logDataBlock.time;
lastlogDataBlock.torque = logDataBlock.torque;
lastlogDataBlock.turns = logDataBlock.turns;
// Verify that next pos have room for new datablock
// if not recalc position
if((logEnd[2] - (sizeof(LogDataBlock_) - 3)) < (logDataBlock.address[2])) // address is three bytes
{
// last byte exceeds registers
if(logEnd[1] > logDataBlock.address[1])
{
logDataBlock.address[1]++;
logDataBlock.address[2] = 0x00;
}
else
{
if(logEnd[0] > logDataBlock.address[0])
{
logDataBlock.address[0]++;
logDataBlock.address[1] = 0x00;
logDataBlock.address[2] = 0x00;
}
else
{
// no more space in flash
// reset pointer to first position
logDataBlock.address[0] = logStart[0];
logDataBlock.address[1] = logStart[1];
logDataBlock.address[2] = logStart[2];
}
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////
//* Function that write data too PS021 *//
// Function copied from ToolControl\test.c 20070130 - so
/////////////////////////////////////////////////////////////////////////////////////
void write_PS021(unsigned char op_code, unsigned char byte0, unsigned char byte1, unsigned char byte2)
{
SPCR = 0x55; //Enable ISP, Master, set SPCR register, fosc/8
SPSR = 0x01; //SPI freq*2
PORTE&=0xFB; //PS021 CS =0
SPSR&=0xBF; //WCOL set to 0
SPDR = op_code;
while(!(SPSR & 0x80)); // Wait until SPIF bit in SPI Status register SPSR is zero
SPDR = byte0; //0xD4;
while(!(SPSR & 0x80)); // Wait until SPIF bit in SPI Status register SPSR is zero
SPDR = byte1; //0x09;
while(!(SPSR & 0x80)); // Wait until SPIF bit in SPI Status register SPSR is zero
SPDR = byte2; //0x22;
while(!(SPSR & 0x80)); // Wait until SPIF bit in SPI Status register SPSR is zero
dummy = SPDR;
PORTE|=0x04; //PS021 CS =1
__delay_cycles(10);
}
/////////////////////////////////////////////////////////////////////////////////////
//* Function that read data on PS021 *//
// Function copied from ToolControl\test.c 20070130 - so
/////////////////////////////////////////////////////////////////////////////////////
void read_PS021(unsigned op_code)
{
unsigned char oldState;
unsigned char torque_byte[4];
SPCR = 0x55; //Enable ISP, Master, set SPCR register, fosc/8
SPSR = 0x01; //SPI freq*2
PORTE&=0xFB; //PS021 CS =0
SPSR&=0xBF; //WCOL set to 0
oldState = __save_interrupt();
__disable_interrupt(); // Interrupts are disabled
SPDR = op_code;
while(!(SPSR & 0x80)); // Wait until SPIF bit in SPI Status register SPSR is zero
dummy = SPDR;
SPDR = op_code;
while(!(SPSR & 0x80)); // Wait until SPIF bit in SPI Status register SPSR is zero
torque_byte[0] = SPDR; // Most sig byte
SPDR = op_code;
while(!(SPSR & 0x80)); // Wait until SPIF bit in SPI Status register SPSR is zero
torque_byte[1] = SPDR;
SPDR = op_code;
while(!(SPSR & 0x80)); // Wait until SPIF bit in SPI Status register SPSR is zero
torque_byte[2] = SPDR; // Least sig byte
__restore_interrupt(oldState);
// Transfer torque value to global input variable
inp.torque[rawIdx] = ((torque_byte[0] << 8) + torque_byte[1]);
PORTE|=0x04; //PS021 CS =1
__delay_cycles(3);
}
/////////////////////////////////////////////////////////////////////////////////////
//* Function that start diferent operation mode on PS021 *//
// Function copied from ToolControl\test.c 20070130 - so
/////////////////////////////////////////////////////////////////////////////////////
void operation_mode_PS021(unsigned op_code)
{
SPCR = 0x55; //Enable ISP, Master, set SPCR register, fosc/8
SPSR = 0x01; //SPI freq*2
PORTE&=0xFB; //PS021 CS =0
SPDR = op_code; //Operation code
while(!(SPSR & 0x80)); // Wait until SPIF bit in SPI Status register SPSR is zero
dummy = SPDR;
PORTE|=0x04; //PS021 CS =1
__delay_cycles(10);
}
/*
* Read communications port
* Return number of bytes received
*/
unsigned char readCom(void)
{
unsigned char Size = 0;
//UART read and store next byte
if(UCSR0A & 0x80) {
Rx[rxIdx]=UDR0;
if(Rx[0] == _STX){
receivingMsg = true;
rxIdx++; // Correct start character ?
switch(Rx[1]){ // Get size of msg
case TCGVAL:
case TTGVAL:
Size = sizeof(TC_Cmd_); break;
case TCSVAL:
case TTSVAL:
Size = sizeof(TC_Value_); break;
case TCRESET:
case TTRESET:
Size = sizeof(TC_Cmd_); break;
case _RQMODE:
Size = sizeof(TC_Cmd_); break;
case TCSETCONF:
Size = sizeof(TC_Configuration_); break;
case TTSETCONF:
// Size = sizeof(TT_Configuration_Rx_); break;
Size = 8; break;
case TCREQCONF:
case TTREQCONF:
Size = sizeof(TC_Cmd_); break;
default:
Size = rxIdx-1; break; // still reading bytes
}
}
else {
rxIdx = 0; // waiting for start character
}
if(rxIdx == Size) {
rxIdx = 0; // reset index
receivingMsg = false;
// Get last Rx message
switch(Rx[1]){ // Get size of msg
case TCGVAL:
inp.turns[lastRawIdx]--;
turnsCmd[reqValIdx] = true;
break;
case TTGVAL:
inp.torque[lastRawIdx]--;
torqueCmd[reqValIdx] = true;
break;
case TCSVAL:
memcpy(&tcVal, Rx, Size);
inp.turns[valIdx] = tcVal.turnsValue;
break;
case TTSVAL:
memcpy(&tcVal, Rx, Size);
inp.torque[valIdx] = tcVal.torqueValue;
break;
case TCRESET:
inp.turns[valIdx] = inp.turns[rawIdx] = inp.turns[pulsIdx] = inp.turns[oldpulsIdx] = 0;
turnsCmd[minusIdx] = false;
tcVal.turnsValue = inp.turns[rawIdx];
break;
case TTRESET:
bDoTara = true;
break;
case TCSETCONF:
memcpy(&tcConf, Rx, Size);
turnsCmd[storeConfIdx] = true;
break;
case TTSETCONF:
memcpy(&tqConf, Rx, Size); // Note that object in Rx buffer is smaller than tqConf
torqueCmd[storeConfIdx] = true;
break;
case TCREQCONF:
turnsCmd[reqConfIdx] = true;
break;
case TTREQCONF:
torqueCmd[reqConfIdx] = true;
break;
case _RQMODE: // Turn off transmit value onChange
bOnChangeMode = false;
break;
}
}
}
return Size;
}
/*
* Write data to serial port
* return index of last written byte, 0 if first or no bytes to write
*/
unsigned char writeCom(void)
{
unsigned char valChanged = 0;
valChanged = ( ( oldFlags != tcVal.flags )
|| (inp.turns[lastRawIdx] != inp.turns[rawIdx]) // Use raw changes for sending turns
|| 500 < intervalWriteCom );
if( valChanged && (0 == txIdx) )
{
if(turnsCmd[reqConfIdx]){
// TCREQCONF received
turnsCmd[reqConfIdx] = false;
tcConf.cmd = TCRETCONF;
txSize = sizeof(tcConf);
memcpy(Tx,&tcConf,txSize);
}
else{
// Normal send current turns counter value
txSize = sizeof(tcVal);
tcVal.torqueValue = inp.torque[valScaledIdx];
memcpy(Tx,&tcVal,txSize);
#ifdef NO_RCU_MODE
if(ForceTaring)
{
if(0 == DoneTaring)
{
ForceWaitCount++;
}
}
#endif
}
}
if( ( (txIdx != 0) || valChanged )
&& (bOnChangeMode || turnsCmd[reqValIdx])
)
{
/* Only send if empty transmit buffer */
if( UCSR0A & (1<<UDRE0)) /*UART write*/
{
UDR0 = Tx[txIdx];
txIdx++;
UCSR0A=UCSR0A;
if( txIdx >= 8) {
txIdx = 0;
inp.turns[lastRawIdx] = inp.turns[rawIdx];
oldFlags = tcVal.flags;
}
if((turnsCmd[reqValIdx]) &&(txIdx == 0)) {
turnsCmd[reqValIdx] = false;
}
}
}
return txIdx;
}
/**
* storeConfig()
* simple task; stores configuration in EEPROM
*/
void storeTurnsConfig(void){
unsigned char oldState;
unsigned int i=0;
unsigned char *pData = (unsigned char *) &tcConf;
unsigned int uiReg = CONFIG_DATA_START_REGISTER;
oldState = __save_interrupt();
__disable_interrupt(); // Interrupts are disabled
// Write data to EEPROM
for(i=0;i<sizeof(tcConf);i++) {
// Wait for previous write to complete
while(EECR & (1<<EEWE))
;
// Set up address and data register
uiReg = i + CONFIG_DATA_START_REGISTER;
EEAR = uiReg;
EEDR = *pData;
// Write logical one to EEMWE
EECR |= (1<<EEMWE);
// Start eeprom write by setting EEWE
EECR |= (1<<EEWE);
pData++;
}
// Wait for previous write to complete
while(EECR & (1<<EEWE))
;
turnsCmd[storeConfIdx] = false;
__restore_interrupt(oldState);
}
/**
* loadConfig()
* simple task; loads configuration from EEPROM
* NOTE: only reads configuration if first byte equals TCSTX
*/
void loadTurnsConfig(void){
unsigned int i;
unsigned int uiReg;
unsigned char *pData = (unsigned char *) &tcConf;
unsigned char Tmp;
unsigned char oldState;
oldState = __save_interrupt();
__disable_interrupt(); // Interrupts are disabled
// Wait for previous write to complete
while(EECR & (1<<EEWE))
;
// First byte should be TCSTX
uiReg = CONFIG_DATA_START_REGISTER;
EEAR = uiReg;
// Start eeprom read by setting EERE
EECR |= (1<<EERE);
// Get Data
Tmp = EEDR;
// Check that first byte is valid
if (_STX == Tmp) {
for(i=0; i<sizeof(tcConf); i++) {
while(EECR & (1<<EEWE))
;
// Set up address and data register
uiReg = i + CONFIG_DATA_START_REGISTER;
EEAR = uiReg;
// Start eeprom read by setting EERE
EECR |= (1<<EERE);
// Get Data
*pData = EEDR;
pData++;
}
}
__restore_interrupt(oldState);
}
#ifndef NOEEPROM
/**
* storeTorqueConfig()
* simple task; stores configuration in EEPROM
*
* Sample config as stored in EEPROM file
* :10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
* :100030000 00C0000009EF9FFFFFFFFFFFFFFFFFF26
* idx: 00, lVal: 0C000000, scaledVal: 9EF9FFFF
* 12
* :10004000 01 5BF5FFFF 12F4FFFF FFFFFFFFFFFFFF64
* :10005000 02 FAF6FFFF A3F5FFFF FFFFFFFFFFFFFF21
* :10006000 03 E8F9FFFF 1EF9FFFF FFFFFFFFFFFFFFA0
* :10007000 04 DBFCFFFF 77FCFFFF FFFFFFFFFFFFFF3D
* :10008000 05 F2FEFFFF FDFEFFFF FFFFFFFFFFFFFF8B
* :10009000 06 E2FFFFFF E3FFFFFF FFFFFFFFFFFFFFA2
* :1000A000 07 1E000000 26000000 FFFFFFFFFFFFFF0C
* :1000B000 08 0E010000 3C010000 FFFFFFFFFFFFFFF3
* :1000C000 09 34030000 C4030000 FFFFFFFFFFFFFF30
* :1000D000 0A 22060000 76070000 FFFFFFFFFFFFFF78
* :1000E000 0B 1A090000 D50A0000 FFFFFFFFFFFFFF0A
* :1000F000 0C AF0A0000 A40C0000 FFFFFFFFFFFFFF92
*
* :10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
*/
void storeTorqueConfig(void){
unsigned char oldState;
unsigned int i=0;
unsigned char *pData = (unsigned char *) &tqConf.idx;
unsigned int uiReg = TORQUE_CONFIG_DATA_START_REGISTER;
unsigned int blockSize = sizeof(tqConf.scaledVal) + sizeof(tqConf.lVal) + sizeof(tqConf.idx);
unsigned int startReg = 0;
// lastTTConfIdx = tqConf.idx;
tqConf.lVal = inp.torque[valTaredIdx];
//tqConf.lVal *= -1;
if(0 < tqConf.idx)
{
ttConf[tqConf.idx -1].rawIn = tqConf.lVal;
ttConf[tqConf.idx -1].scaledOut = tqConf.scaledVal;
}
startReg = (tqConf.idx * 16) + TORQUE_CONFIG_DATA_START_REGISTER;
oldState = __save_interrupt();
__disable_interrupt(); // Interrupts are disabled
// Write data to EEPROM
for(i=0; i < blockSize; i++) {
// Wait for previous write to complete
while(EECR & (1<<EEWE))
;
// Set up address and data register
uiReg = i + startReg;
EEAR = uiReg;
EEDR = *pData;
// Write logical one to EEMWE
EECR |= (1<<EEMWE);
// Start eeprom write by setting EEWE
EECR |= (1<<EEWE);
pData++;
}
// Wait for previous write to complete
while(EECR & (1<<EEWE))
;
__restore_interrupt(oldState);
torqueCmd[storeConfIdx] = false;
if(0 == tqConf.idx)
{
countTTConfIdx = tqConf.scaledVal;
if(TORQUE_SCALEPAIR_COUNT < countTTConfIdx)
{
countTTConfIdx = TORQUE_SCALEPAIR_COUNT;
}
}
}
/**
* loadTorqueConfig()
* simple task; loads configuration from EEPROM
* NOTE: only reads configuration if first byte equals TCSTX
*/
void loadTorqueConfig(void){
unsigned int i;
unsigned int uiReg;
TT_Configuration_ tmpTqConf;
unsigned char *pData = (unsigned char *) &tmpTqConf.idx;
unsigned char oldState;
unsigned char tmp;
unsigned int blockSize = sizeof(tmpTqConf.scaledVal) + sizeof(tmpTqConf.lVal) + sizeof(tmpTqConf.idx);
unsigned char startReg = 0;
startReg = (lastTTConfIdx * 16) + TORQUE_CONFIG_DATA_START_REGISTER;
oldState = __save_interrupt();
__disable_interrupt(); // Interrupts are disabled
// Wait for previous write to complete
while(EECR & (1<<EEWE))
;
// Check if EEPROM is blank, first item should be 0x00
uiReg = TORQUE_CONFIG_DATA_START_REGISTER;
EEAR = uiReg;
// Start eeprom read by setting EERE
EECR |= (1<<EERE);
// Get Data
tmp = EEDR;
if((0x0 == tmp) )
{
// Read config stored at lastTTConfIdx
for(i=0; i<blockSize; i++)
{
while(EECR & (1<<EEWE))
;
// Set up address and data register
uiReg = i + startReg;
EEAR = uiReg;
// Start eeprom read by setting EERE
EECR |= (1<<EERE);
// Get Data
*pData = EEDR;
pData++;
}
if(0 == lastTTConfIdx) // Reading at index 0, update counter
{
countTTConfIdx = tmpTqConf.scaledVal;
}
else
{
ttConf[lastTTConfIdx -1].rawIn = tmpTqConf.lVal;
ttConf[lastTTConfIdx -1].scaledOut = tmpTqConf.scaledVal;
}
}
__restore_interrupt(oldState);
}
#endif
void updateTurnsLED(void)
{
decimal = inp.turns[valIdx]%10;
ones = (inp.turns[valIdx]/10)%10;
tens = (inp.turns[valIdx]/100)%10;
hundreds = (inp.turns[valIdx]/1000)%10;
/*
decimal = torqueReadCount%10;
ones = (torqueReadCount/10)%10;
tens = (torqueReadCount/100)%10;
hundreds = (torqueReadCount/1000)%10;
*/
Write_Display(Digit0_turn,digits[decimal]);
Write_Display(Digit1_turn,(digits[ones]|0x80));
Write_Display(Digit2_turn,digits[tens]);
Write_Display(Digit3_turn,digits[hundreds]);
if(turnsCmd[minusIdx])
PORTB&= 0xFE;
else
PORTB|=0x01;
}
void updateTorqueLED(void)
{
long torqueVal = inp.torque[valScaledIdx];
if(0 > inp.torque[valScaledIdx])
{
PORTB&= 0xFD; // Turn on
torqueVal = torqueVal -1;
torqueVal = ~torqueVal;
}
else
PORTB|=0x02; // Turn off
decimal = torqueVal%10;
ones = (torqueVal/10)%10;
tens = (torqueVal/100)%10;
hundreds = (torqueVal/1000)%10;
Write_Display(Digit0_torque,digits[decimal]); //Rx[0]
Write_Display(Digit1_torque,(digits[ones])); //|0x80
Write_Display(Digit2_torque,digits[tens]);
Write_Display(Digit3_torque,digits[hundreds]);
}
void powerDown(void)
{
if((power_down > 600000) && !Ex_power) {
Write_Display(0x04,0x00); //Configuration
//PORTE = 0xFF;
//PORTA = 0xFF;
//PORTC|= 0x80;
//PORTC&=0xF0;
TIMSK = 0x00; /* Timer1 compareA match interrup disable, Timer0 overflow disable */
switch(next_state){/* Sleep enable, idle mode, iNT0 and iNT1 on the rising edge */
case 3:MCUCR = 0x2F; break;
case 2:MCUCR = 0x2C; break;
case 1:MCUCR = 0x23; break;
case 0:MCUCR = 0x2A; break;
}
GICR = 0xC0; /* iNT0 and iNT1 enable */
_SLEEP();
GICR = 0x00; /* iNT0 and iNT1 disable */
TIMSK = 0x42; /* Timer1 compareA match interrup enable, Timer0 overflow enable */
Write_Display(0x04,0x01); //Configuration
// PORTC|=0x02;
power_down = 0;
}
}
void activateCom(void)
{
// PORTC = ((Ex_power)? (Comm_ON) : (Comm_OFF));
}
void checkPower(void)
{
Ex_power = ACSR & 0x20;
//Itf_box = (0 == (PIND & 0x40)); // Interface box at PORTD pin6
}
#ifdef NO_RCU_MODE
// Check if the pins are shorted
void checkForceTaring(void)
{
ForceTaring = (0 == (PIND & 0x80)); // Short circuited
#ifdef TESTING_NORCU
if(ForceTaring)
{
PORTA&= 0xEF;
}
else
{
PORTA|= 0x10;
}
#endif
// If ForceTaring is true
// Wait some time and allow reading to stabilize
// then set
// bDoTara = true;
// in order to initiate and stora tara reading
if(ForceTaring)
{
if(0 == DoneTaring)
{
#ifdef TESTING_NORCU
ForceWaitCount++; // Counted up in WriteCom
if(0 == ForceWaitCount%2)
{
if(0==(PORTA & 0xDF))
{
PORTA|= 0x20;
}
else
{
PORTA&= 0xDF;
}
}
#endif
if(200 < ForceWaitCount)
{
bDoTara = true;
ForceWaitCount = 0;
DoneTaring = 1;
}
}
}
}
#endif
/////////////////////////////////////////////////////////////////////////////////////
//* Function that write data to the display*
/////////////////////////////////////////////////////////////////////////////////////
void Write_Display(unsigned char Disp_data_H, unsigned char Disp_data_L)
{
SPCR = 0x51; //Enable ISP, Master, set SPCR register, fosc/16
SPSR = 0x00;
PORTC&= 0xEF; //(0 << PORTC4); // DISP-CS = 0 PORTC=PORTC & 0xEF; //
_NOP();
_NOP();
SPDR = Disp_data_H; //Data high byte
while(!(SPSR & 0x80))
; // Wait until SPIF bit in SPI Status register SPSR is zero
SPDR = Disp_data_L; //Data low byte
while(!(SPSR & 0x80))
; // Wait until SPIF bit in SPI Status register SPSR is zero
_NOP();
_NOP();
PORTC|= 0x10; //(1 << PORTC4); // DISP-CS = 1
}
void initHW(void)
{
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600 @ f=16,000MHz
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x86;
UBRR0L=119;
// Crystal Oscillator division factor: 1
//CLKPR=0x80;
CLKPR=0x00;
// Input/Output Ports initialization
// Port A initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T
PORTA=0xFF;
DDRA=0xF0;
// Port B initialization
// Func0=Out Func1=In Func2=In Func3=In Func4=In Func5=Out Func6=In Func7=Out
// State0=Out State1=Out State2=T State3=T State4=P State5=0 State6=P State7=0
DDRB=0xA3;
PORTB=0x53;
// Port C initialization
// Func0=Out Func1=Out Func2=Out Func3=In Func4=Out Func5=In Func6=In Func7=In
// State0=0 State1=0 State2=1 State3=T State4=1 State5=T State6=T State7=T
PORTC=0x5C;
DDRC=0x9F;
// Port D initialization
// Func0=In Func1=Out Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=T State1=0 State2=P State3=P State4=T State5=T State6=T State7=T
PORTD=0x0C;
DDRD=0x02;
#ifdef NO_RCU_MODE
PORTD |=0x80; // Activate pull up: PORTD7
#endif
// Port E initialization
// Func0=In Func1=In Func2=In
// State0=T State1=T State2=T
PORTE=0x07;
DDRE=0x06;
// Crystal Oscillator division factor: 1
CLKPR=0x80;
CLKPR=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x0C; // clkIO/256 (From prescaler)
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x10;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-15: Off
GICR|=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
ETIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x00;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 1000,000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
//SPCR=0x55;
//SPSR=0x00;
// Added from ToolControl\test.c 20070130 - so
PORTE&=0xFB; //PS021 CS =0
__delay_cycles(10);
PORTE|=0x04; //PS021 CS =1
__delay_cycles(10);
}
Editor is loading...
Leave a Comment