Problem with comparison.
/Modules/Sensors/IMU01A/SW/Python/IMU_test.ipynb
0,0 → 1,599
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Uk\u00e1zka pou\u017eit\u00ed n\u00e1stroje IPython na manipulaci se senzorov\u00fdmi daty modulu IMU01A\n",
"=======\n",
"\n",
"P\u0159\u00edklad vyu\u017e\u00edv\u00e1 modulovou stavebnici MLAB a jej\u00ed knihovnu [pymlab](https://github.com/MLAB-project/MLAB-I2c-modules).\n",
"Sn\u00edma\u010d je k po\u010d\u00edta\u010di p\u0159ipojen\u00fd p\u0159es rozhradn\u00ed USB a data jsou vy\u010d\u00edt\u00e1na p\u0159es [I\u00b2C](http://wiki.mlab.cz/doku.php?id=cs:i2c)\n",
"\n",
"Pou\u017eit\u00fd akcelerometr [MMA8451Q](http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MMA8451Q) m\u00e1 n\u00e1sleduj\u00edc\u00ed katalogov\u00e9 parametry: \n",
"\n",
"* \u00b12g/\u00b14g/\u00b18g dynamically selectable full-scale\n",
"* Output data rates (ODR) from 1.56 Hz to 800 Hz\n",
"* 99 \u03bcg/\u221aHz noise\n",
"\n",
"Zprovozn\u011bn\u00ed demo k\u00f3du\n",
"---------------------\n",
"\n",
"Nejd\u0159\u00edve zjist\u00edme zda m\u00e1me p\u0159\u00edstup pro z\u00e1pis a \u010dten\u00ed do syst\u00e9mov\u00e9ho za\u0159\u00edzen\u00ed. A jak\u00e9 \u010d\u00edslo m\u00e1 I\u00b2C sb\u011brnice na kterou m\u00e1me p\u0159ipojen\u00e1 \u010didla. \n",
"P\u0159\u00edpadn\u011b je mo\u017en\u00e9 tuto \u010d\u00e1st p\u0159esko\u010dit a vyu\u017e\u00edt p\u0159\u00edmo predem ulo\u017een\u00fd datov\u00fd set.\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!i2cdetect -l"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"i2c-0\ti2c \ti915 gmbus ssc \tI2C adapter\r\n",
"i2c-1\ti2c \ti915 gmbus vga \tI2C adapter\r\n",
"i2c-2\ti2c \ti915 gmbus panel \tI2C adapter\r\n",
"i2c-3\ti2c \ti915 gmbus dpc \tI2C adapter\r\n",
"i2c-4\ti2c \ti915 gmbus dpb \tI2C adapter\r\n",
"i2c-5\ti2c \ti915 gmbus dpd \tI2C adapter\r\n",
"i2c-6\ti2c \tDPDDC-B \tI2C adapter\r\n",
"i2c-7\ti2c \ti2c-tiny-usb at bus 001 device 025\tI2C adapter\r\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Proto\u017ee pro p\u0159ipojen\u00ed \u010didel k po\u010d\u00edta\u010di pou\u017e\u00edv\u00e1me adapt\u00e9r i2c-tiny-usb. Vid\u00edme, \u017ee sb\u011brnice m\u00e1 aktu\u00e1ln\u011b ozna\u010den\u00ed nap\u0159\u00edklad i2c-8. \n",
"\n",
"V p\u0159\u00edpad\u011b, \u017ee v\u00fd\u0161e uveden\u00fd p\u0159\u00edklad vr\u00e1t\u00ed chybu, nebo pojmenov\u00e1n\u00ed \"unknown\" tak nem\u00e1me p\u0159\u00edstup k syst\u00e9mov\u00fdm rozhran\u00edm. Ten z\u00edsk\u00e1me vytvo\u0159en\u00edm souboru s n\u00e1sleduj\u00edc\u00edm obsahem ve slo\u017ece: /etc/udev/rules.d/i2c-devices.rules"
]
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"KERNEL==\"i2c-[0-9]*\", GROUP=\"i2c\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Toto ozna\u010den\u00ed budeme je\u0161t\u011b d\u00e1le pot\u0159ebovat, proto si jej ulo\u017e\u00edme da prom\u011bnn\u00e9. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"port = 7"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Budeme pokra\u010dovat na\u010dten\u00edm pot\u0159ebn\u00fdch modul\u016f pro zach\u00e1zen\u00ed s I\u00b2C sn\u00edma\u010di."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import time\n",
"import datetime\n",
"import sys\n",
"\n",
"from pymlab import config\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nyn\u00ed si nadefinujeme strukturu p\u0159ipojen\u00ed jednotliv\u00fdch \u010didel na I\u00b2C sb\u011brnici."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cfg = config.Config(\n",
" i2c = {\n",
" \"port\": port,\n",
" },\n",
" bus = [\n",
" {\n",
" \"type\": \"i2chub\",\n",
" \"address\": 0x72,\n",
" \n",
" \"children\": [\n",
" {\"name\": \"acc\", \"type\": \"imu01_acc\", \"sensitivity\": 4.0, \"channel\": 0, }, \n",
" ],\n",
" },\n",
" ],\n",
")"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 30
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tuto strukturu inicializujeme, aby jsme dos\u00e1hli definovan\u00e9 konfigurace \u010didel."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cfg.initialize()\n",
"acc = cfg.get_device(\"acc\")\n",
"time.sleep(0.5)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stderr",
"text": [
"WARNING:pymlab.sensors.iic:HID device does not exist, we will try SMBus directly...\n"
]
}
],
"prompt_number": "*"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\u010cten\u00ed dat z akcelerometru\n",
"-------------------------\n",
"\n",
"Nyn\u00ed u\u017e m\u016f\u017eeme p\u0159\u00edmo komunikovat se za\u0159\u00edzen\u00edm pojmenovan\u00fdm jako acc."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import sys\n",
"import time\n",
"from IPython.display import clear_output\n",
"\n",
"MEASUREMENTS = 1000\n",
"list_meas = []\n",
"# acc.route() V p\u0159\u00edpad\u011b v\u00edce \u010didel je pot\u0159eba ke ka\u017ed\u00e9mu p\u0159ed jeho pou\u017eit\u00edm nechat vyroutovat cesutu na sb\u011brnici.\n",
"\n",
"for n in range(MEASUREMENTS):\n",
" clear_output()\n",
" (x, y, z) = acc.axes()\n",
" list_meas.append([x, y, z])\n",
" print (n, list_meas[n])\n",
" sys.stdout.flush()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"(999, [0.038024999999999996, -0.00975, 0.966225])\n"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"np.savez(\"calibration_data_3Dset\", data=list_meas)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Kalibrace akcelerometru\n",
"-----------------------\n",
"\n",
"Nam\u011b\u0159en\u00e1 data m\u016f\u017eeme tak\u00e9 z\u00edskat z p\u0159edem ulo\u017een\u00e9ho souboru. V n\u00e1sleduj\u00edc\u00edm bloku je otev\u0159en soubor s referen\u010dn\u00edmi daty, kter\u00fd se nach\u00e1z\u00ed v dokumenta\u010dn\u00ed slo\u017ece mudulu IMU01A. \n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"data = np.load('./calibration_data_3Dset.npz')\n",
"list_meas=data['data']"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"data = np.load('./calibration_data_set.npz')\n",
"x=data['x']\n",
"y=data['y']\n",
"z=data['z']"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from mpl_toolkits.mplot3d.axes3d import Axes3D\n",
"#%pylab qt\n",
"%pylab inline\n",
"fig = plt.figure()\n",
"ax = Axes3D(fig)\n",
"p = ax.scatter(x, y, z)\n",
"#pyplot.show()\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nnUoM6Czcwc8AAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x7fc77d537c90>"
]
}
],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import scipy\n",
"from scipy import optimize\n",
"import calibration_utils\n",
"\n",
"sensor_ref = 9.81\n",
"sensor_res = 10\n",
"noise_window = 20\n",
"noise_threshold = 40"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"measurements = np.array(list_meas)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"meas_median=scipy.median(scipy.array([scipy.linalg.norm(v) for v in measurements]))\n",
"noise_threshold = meas_median * 0.1\n",
"print noise_threshold\n",
"flt_meas, flt_idx = calibration_utils.filter_meas(measurements, noise_window, noise_threshold)\n",
"print(\"remaining \"+str(len(flt_meas))+\" after filtering\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0.0973014827316\n",
"remaining 703 after filtering\n"
]
}
],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [
" p0 = calibration_utils.get_min_max_guess(flt_meas, sensor_ref)\n",
" cp0, np0 = calibration_utils.scale_measurements(flt_meas, p0)\n",
" print(\"initial guess : avg \"+str(np0.mean())+\" std \"+str(np0.std()))\n",
"\n",
" def err_func(p, meas, y):\n",
" cp, np = calibration_utils.scale_measurements(meas, p)\n",
" err = y*scipy.ones(len(meas)) - np\n",
" return err"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"initial guess : avg 9.55977014083 std 0.17596103611\n"
]
}
],
"prompt_number": 21
},
{
"cell_type": "code",
"collapsed": false,
"input": [
" p1, cov, info, msg, success = optimize.leastsq(err_func, p0[:], args=(flt_meas, sensor_ref), full_output=1)\n",
" if not success in [1, 2, 3, 4]:\n",
" print(\"Optimization error: \", msg)\n",
" print(\"Please try to provide a clean logfile.\")\n",
" sys.exit(1)\n",
"\n",
" cp1, np1 = calibration_utils.scale_measurements(flt_meas, p1)\n",
" print(\"optimized guess : avg \"+str(np1.mean())+\" std \"+str(np1.std()))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"optimized guess : avg 9.80797237599 std 0.141020849641\n"
]
}
],
"prompt_number": 22
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab qt\n",
"#%pylab inline\n",
"calibration_utils.plot_results(True, measurements, flt_idx, flt_meas, cp0, np0, cp1, np1, sensor_ref)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"prompt_number": 24
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\u010cten\u00ed dat z gyroskopu\n",
"---------------------\n",
"\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cfg = config.Config(\n",
" i2c = {\n",
" \"port\": port,\n",
" },\n",
"\n",
"\tbus = [\n",
"\t\t{\n",
" \"type\": \"i2chub\",\n",
" \"address\": 0x72,\n",
" \n",
" \"children\": [\n",
" {\"name\": \"gyro\", \"type\": \"imu01_gyro\", \"channel\": 0, }\n",
" ],\n",
"\t\t},\n",
"\t],\n",
")\n",
"\n",
"cfg.initialize()\n",
"#acc = cfg.get_device(\"acc\")\n",
"gyro = cfg.get_device(\"gyro\")\n",
"sys.stdout.write(\" MLAB accelerometer sensor IMU01A module example \\r\\n\")\n",
"time.sleep(0.5)\n",
"gyro.route()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stderr",
"text": [
"WARNING:pymlab.sensors.iic:HID device does not exist, we will try SMBus directly...\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" MLAB accelerometer sensor IMU01A module example \r\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": [
"True"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import sys\n",
"import time\n",
"from IPython.display import clear_output\n",
"\n",
"MEASUREMENTS = 100\n",
"list_meas = []\n",
"# acc.route() V p\u0159\u00edpad\u011b v\u00edce \u010didel je pot\u0159eba ke ka\u017ed\u00e9mu p\u0159ed jeho pou\u017eit\u00edm nechat vyroutovat cesutu na sb\u011brnici.\n",
"\n",
"for n in range(MEASUREMENTS):\n",
" clear_output()\n",
" (x, y, z) = gyro.axes()\n",
" list_meas.append([x, y, z])\n",
" print (n, list_meas[n])\n",
" sys.stdout.flush()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"(99, [195, -118, 7])\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"measurements = np.array(list_meas)\n",
"\n",
"%pylab qt\n",
"plt.subplot(1, 1, 1)\n",
"plt.plot(measurements[:, 0])\n",
"plt.plot(measurements[:, 1])\n",
"plt.plot(measurements[:, 2])\n",
"plt.xlabel('sample number')\n",
"plt.ylabel('ADC')\n",
"plt.title('Raw sensors')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"text": [
"<matplotlib.text.Text at 0x7f5b38053450>"
]
}
],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"help(map)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Help on built-in function map in module __builtin__:\n",
"\n",
"map(...)\n",
" map(function, sequence[, sequence, ...]) -> list\n",
" \n",
" Return a list of the results of applying the function to the items of\n",
" the argument sequence(s). If more than one sequence is given, the\n",
" function is called with an argument list consisting of the corresponding\n",
" item of each sequence, substituting None for missing values when not all\n",
" sequences have the same length. If the function is None, return a list of\n",
" the items of the sequence (or a list of tuples if more than one sequence).\n",
"\n"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
/Modules/Sensors/IMU01A/SW/Python/.ipynb_checkpoints/IMU_test-checkpoint.ipynb
0,0 → 1,572
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Uk\u00e1zka pou\u017eit\u00ed n\u00e1stroje IPython na manipulaci se senzorov\u00fdmi daty modulu IMU01A\n",
"=======\n",
"\n",
"P\u0159\u00edklad vyu\u017e\u00edv\u00e1 modulovou stavebnici MLAB a jej\u00ed knihovnu [pymlab](https://github.com/MLAB-project/MLAB-I2c-modules).\n",
"Sn\u00edma\u010d je k po\u010d\u00edta\u010di p\u0159ipojen\u00fd p\u0159es rozhradn\u00ed USB a data jsou vy\u010d\u00edt\u00e1na p\u0159es [I\u00b2C](http://wiki.mlab.cz/doku.php?id=cs:i2c)\n",
"\n",
"Pou\u017eit\u00fd akcelerometr [MMA8451Q](http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MMA8451Q) m\u00e1 n\u00e1sleduj\u00edc\u00ed katalogov\u00e9 parametry: \n",
"\n",
"* \u00b12g/\u00b14g/\u00b18g dynamically selectable full-scale\n",
"* Output data rates (ODR) from 1.56 Hz to 800 Hz\n",
"* 99 \u03bcg/\u221aHz noise\n",
"\n",
"Zprovozn\u011bn\u00ed demo k\u00f3du\n",
"---------------------\n",
"\n",
"Nejd\u0159\u00edve zjist\u00edme zda m\u00e1me p\u0159\u00edstup pro z\u00e1pis a \u010dten\u00ed do syst\u00e9mov\u00e9ho za\u0159\u00edzen\u00ed. A jak\u00e9 \u010d\u00edslo m\u00e1 I\u00b2C sb\u011brnice na kterou m\u00e1me p\u0159ipojen\u00e1 \u010didla. \n",
"P\u0159\u00edpadn\u011b je mo\u017en\u00e9 tuto \u010d\u00e1st p\u0159esko\u010dit a vyu\u017e\u00edt p\u0159\u00edmo predem ulo\u017een\u00fd datov\u00fd set.\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!i2cdetect -l"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"i2c-0\ti2c \ti915 gmbus ssc \tI2C adapter\r\n",
"i2c-1\ti2c \ti915 gmbus vga \tI2C adapter\r\n",
"i2c-2\ti2c \ti915 gmbus panel \tI2C adapter\r\n",
"i2c-3\ti2c \ti915 gmbus dpc \tI2C adapter\r\n",
"i2c-4\ti2c \ti915 gmbus dpb \tI2C adapter\r\n",
"i2c-5\ti2c \ti915 gmbus dpd \tI2C adapter\r\n",
"i2c-6\ti2c \tDPDDC-B \tI2C adapter\r\n",
"i2c-7\ti2c \ti2c-tiny-usb at bus 001 device 013\tI2C adapter\r\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Proto\u017ee pro p\u0159ipojen\u00ed \u010didel k po\u010d\u00edta\u010di pou\u017e\u00edv\u00e1me adapt\u00e9r i2c-tiny-usb. Vid\u00edme, \u017ee sb\u011brnice m\u00e1 aktu\u00e1ln\u011b ozna\u010den\u00ed nap\u0159\u00edklad i2c-8. \n",
"\n",
"V p\u0159\u00edpad\u011b, \u017ee v\u00fd\u0161e uveden\u00fd p\u0159\u00edklad vr\u00e1t\u00ed chybu, nebo pojmenov\u00e1n\u00ed \"unknown\" tak nem\u00e1me p\u0159\u00edstup k syst\u00e9mov\u00fdm rozhran\u00edm. Ten z\u00edsk\u00e1me vytvo\u0159en\u00edm souboru s n\u00e1sleduj\u00edc\u00edm obsahem ve slo\u017ece: /etc/udev/rules.d/i2c-devices.rules"
]
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"KERNEL==\"i2c-[0-9]*\", GROUP=\"i2c\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Toto ozna\u010den\u00ed budeme je\u0161t\u011b d\u00e1le pot\u0159ebovat, proto si jej ulo\u017e\u00edme da prom\u011bnn\u00e9. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"port = 7"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Budeme pokra\u010dovat na\u010dten\u00edm pot\u0159ebn\u00fdch modul\u016f pro zach\u00e1zen\u00ed s I\u00b2C sn\u00edma\u010di."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import time\n",
"import datetime\n",
"import sys\n",
"\n",
"from pymlab import config\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": "*"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nyn\u00ed si nadefinujeme strukturu p\u0159ipojen\u00ed jednotliv\u00fdch \u010didel na I\u00b2C sb\u011brnici."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cfg = config.Config(\n",
" i2c = {\n",
" \"port\": port,\n",
" },\n",
" bus = [\n",
" {\n",
" \"type\": \"i2chub\",\n",
" \"address\": 0x72,\n",
" \n",
" \"children\": [\n",
" {\"name\": \"acc\", \"type\": \"imu01_acc\", \"sensitivity\": 4.0, \"channel\": 0, }, \n",
" ],\n",
" },\n",
" ],\n",
")"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 30
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tuto strukturu inicializujeme, aby jsme dos\u00e1hli definovan\u00e9 konfigurace \u010didel."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cfg.initialize()\n",
"acc = cfg.get_device(\"acc\")\n",
"time.sleep(0.5)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stderr",
"text": [
"WARNING:pymlab.sensors.iic:HID device does not exist, we will try SMBus directly...\n"
]
}
],
"prompt_number": "*"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\u010cten\u00ed dat z akcelerometru\n",
"-------------------------\n",
"\n",
"Nyn\u00ed u\u017e m\u016f\u017eeme p\u0159\u00edmo komunikovat se za\u0159\u00edzen\u00edm pojmenovan\u00fdm jako acc."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import sys\n",
"import time\n",
"from IPython.display import clear_output\n",
"\n",
"MEASUREMENTS = 1000\n",
"list_meas = []\n",
"# acc.route() V p\u0159\u00edpad\u011b v\u00edce \u010didel je pot\u0159eba ke ka\u017ed\u00e9mu p\u0159ed jeho pou\u017eit\u00edm nechat vyroutovat cesutu na sb\u011brnici.\n",
"\n",
"for n in range(MEASUREMENTS):\n",
" clear_output()\n",
" (x, y, z) = acc.axes()\n",
" list_meas.append([x, y, z])\n",
" print (n, list_meas[n])\n",
" sys.stdout.flush()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"(999, [0.038024999999999996, -0.00975, 0.966225])\n"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"np.savez(\"calibration_data_3Dset\", data=list_meas)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Kalibrace akcelerometru\n",
"-----------------------\n",
"\n",
"Nam\u011b\u0159en\u00e1 data m\u016f\u017eeme tak\u00e9 z\u00edskat z p\u0159edem ulo\u017een\u00e9ho souboru. V n\u00e1sleduj\u00edc\u00edm bloku je otev\u0159en soubor s referen\u010dn\u00edmi daty, kter\u00fd se nach\u00e1z\u00ed v dokumenta\u010dn\u00ed slo\u017ece mudulu IMU01A. \n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"data = np.load('./calibration_data_set.npz')\n",
"x=data['x']\n",
"y=data['y']\n",
"z=data['z']"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from mpl_toolkits.mplot3d.axes3d import Axes3D\n",
"#%pylab qt\n",
"%pylab inline\n",
"fig = plt.figure()\n",
"ax = Axes3D(fig)\n",
"p = ax.scatter(x, y, z)\n",
"#pyplot.show()\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd4FNX6gN+Z7SW9NzoovXdpghV7QeQq/Cx4RVGv1y6I\nBcGG2NCr2HtDxAICKggivYcaIJQkhJBCdpPtOzO/P+Kum0YSCIGQeZ/HJw+PuztndmfOO+ec73yf\noCiKgoqKioqKShNBPN0NUFFRUVFRaUhU8amoqKioNClU8amoqKioNClU8amoqKioNClU8amoqKio\nNClU8amoqKioNClU8amoqKioNClU8amoqKioNClU8amoqKioNClU8amoqKioNClU8amoqKioNClU\n8amoqKioNClU8amoqKioNClU8amoqKioNClU8amoqKioNClU8amoqKioNClU8amoqKioNClU8amo\nqKioNClU8amoqKioNClU8amoqKioNClU8amoqKioNClU8amoqKioNClU8amoqKioNClU8amoqKio\nNCm0p7sBKiqnElmWcbvd+Hw+dDodGo0GjUaDKIoIgoAgCKe7iSoqKg2MKj6VsxJZlvH7/UiShKIo\nyLKM1+tFUZRysguIUBWiikrTQRWfyllFqPAABEFAFMXgf6EEhBh4bSgBEWq12uB7VSGqqJwdqOJT\nafQoioKiKPh8PmRZBignKUVRqnxfdSILCNHn8+H1ejEajcHXi6KoClFFpZGjik+l0RIqPKfTiSAI\nGI3GKiVUFzEFRBaYFtVoNMHjBUaIXq+33OtVIaqoNB5U8ak0OgIC8vv9wRFegFMpmppGiNUJUavV\nBtcPVSGqqJx+VPGpNBoqCi8gkFMlkcCorzavO54QPR5PpddXJcSKa5AqKiqnBlV8Kmc8iqIgSRKS\nJFUrvJokVTGasyGoSoiBNlYnxIoRphqNRh0dqqjUM6r4VM5YAsLz+/1BcdV1hOfz+XC5XPj9/nIj\nq9M17Rg4VnVCDJxvxfdUXD9UhaiicuKo4lM546hKeHWdBgwIT5ZljEYjOp0OKBtpBfb0BdYHQ0UY\nupevIamrEBVFKRdQU3ENUUVFpXpU8amcMZyM8ARBQJKkcsIzmUzo9XoAvF5vuQjNwPEC63CB/yqu\nHwaiRk+XVGorxMD35ff70Wq1lbLUqEJUUfkHVXwqp52THeEF3u/z+fD7/UHh1XYfX1Ub2wOf6fF4\n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\n2LTpIE5nP2R5JCpVGjpdFnp9Lb76ajuNG/8bcDFv3mvUqBFLhw7tvH3p1asHX3zxFBUVw66nJczj\nqadG0LlzJzZs2IlWOw5RvJudO9fzyCPjWLt20S2H6JtMJl544VnvvorL5cJgMNwwbr82cZw8eZKH\nHhqD09kIScqkefMQJk+eh1qt9hYo9vHxqRJ9+NNVvCRJOJ0eq7lycqkkwso/tzNpJSYm3rB4AI8F\nFB2dTlbWMVQqIw7HRTp1qn2TK/zxqFGjBjVq1PjF/y8oKCA5OZlNm85w6lQOstwHUWyP212O251P\nWdlmBKE6JSUVGI17EcVQ0tLe5amnJrFy5QIA1q49SEDAw/j4RKPRfAo0oKysnPr1a5GTE8/48V2I\ni4tj1KiXyMsrplmzOvTp04FRo17Hz28iFosOSSrH5SrBaByGIDzI2rV7yc9fREJCNTZs+BCrteJ6\nPb4CjEaPvq0giMhyHXbt+o4DB5xoNI/gcl3j4MG3+Pe/J/9ulQoEQfiftQ4rcbtFaP8q+EcQ339C\npeKFy+VCq9V63WN/Bn4L8S1cuJSPPlqHQhGDy5WCQqGmrKwJGk0o+flfcN99ng+5c+cO15OJFyKK\nMmPH9iE+Pp6UlBS02nb06DGCjRu/Ax4iJeUlVKqp13PYNnD8+E4CAwOpWXMkhYXnUasfpKQkB7W6\nHSkpg1EqjUhSXxSKQNRqDVbrA3z//dEqxBcTE8OSJe+yfPk6ysvP06fPWDp27MDx48cxmwPx8xuK\nLEsoFCPIyNhITk7OdUWaX0dl/qQsy16FnJKSkirP81ZW5888Mx2r9RW02l6IooujRweyfv36X7U2\nf+4qrYQkSaxZs4ZTp1KpXj2C+++/7wYS/Okq/uc4ffocBw6k43bLJCZWp3Hjht7jFAoF3bu34cKF\nDCyWa4SH165Si/B/BT/88AP/+tdbWCxxmM2XcDrTkaT3UCrbAhVIUhlW60yMRhGNpg8KhWfBplIN\n5+TJBd7reMZOgSCIREc3Iy3tc+z2PpjN6fj4/EBcXHsmTvwASRqDj08dkpPXc+XKcsCIWm3C17cN\nNlsyxcW1iYjogq9vdXx8Yli//lHi4++iUaM+pKSswGiUSUpqRkrKhzidz2C3n0el2khqai18fKZi\nMHjqM+bmFrJr157bKup8u/gjrcM7dXX+3QSq4R9OfG63m4qKChwOByqVCoVCcVu11X5P3O5LeeHC\n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\nAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0xb5c440c>"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import scipy\n",
"from scipy import optimize\n",
"import calibration_utils\n",
"\n",
"sensor_ref = 9.81\n",
"sensor_res = 10\n",
"noise_window = 20\n",
"noise_threshold = 40"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"measurements = np.array(list_meas)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"meas_median=scipy.median(scipy.array([scipy.linalg.norm(v) for v in measurements]))\n",
"noise_threshold = meas_median * 0.1\n",
"print noise_threshold\n",
"flt_meas, flt_idx = calibration_utils.filter_meas(measurements, noise_window, noise_threshold)\n",
"print(\"remaining \"+str(len(flt_meas))+\" after filtering\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0.0973014827316\n",
"remaining 703 after filtering"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 21
},
{
"cell_type": "code",
"collapsed": false,
"input": [
" p0 = calibration_utils.get_min_max_guess(flt_meas, sensor_ref)\n",
" cp0, np0 = calibration_utils.scale_measurements(flt_meas, p0)\n",
" print(\"initial guess : avg \"+str(np0.mean())+\" std \"+str(np0.std()))\n",
"\n",
" def err_func(p, meas, y):\n",
" cp, np = calibration_utils.scale_measurements(meas, p)\n",
" err = y*scipy.ones(len(meas)) - np\n",
" return err"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"initial guess : avg 9.55977014083 std 0.17596103611\n"
]
}
],
"prompt_number": 22
},
{
"cell_type": "code",
"collapsed": false,
"input": [
" p1, cov, info, msg, success = optimize.leastsq(err_func, p0[:], args=(flt_meas, sensor_ref), full_output=1)\n",
" if not success in [1, 2, 3, 4]:\n",
" print(\"Optimization error: \", msg)\n",
" print(\"Please try to provide a clean logfile.\")\n",
" sys.exit(1)\n",
"\n",
" cp1, np1 = calibration_utils.scale_measurements(flt_meas, p1)\n",
" print(\"optimized guess : avg \"+str(np1.mean())+\" std \"+str(np1.std()))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"optimized guess : avg 9.80797237599 std 0.141020849641\n"
]
}
],
"prompt_number": 23
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#%pylab qt\n",
"%pylab inline\n",
"calibration_utils.plot_results(True, measurements, flt_idx, flt_meas, cp0, np0, cp1, np1, sensor_ref)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nctAxpREAAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x7f7113c306d0>"
]
}
],
"prompt_number": 26
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\u010cten\u00ed dat z gyroskopu\n",
"---------------------\n",
"\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cfg = config.Config(\n",
" i2c = {\n",
" \"port\": port,\n",
" },\n",
"\n",
"\tbus = [\n",
"\t\t{\n",
" \"type\": \"i2chub\",\n",
" \"address\": 0x72,\n",
" \n",
" \"children\": [\n",
" {\"name\": \"gyro\", \"type\": \"imu01_gyro\", \"channel\": 0, }\n",
" ],\n",
"\t\t},\n",
"\t],\n",
")\n",
"\n",
"cfg.initialize()\n",
"#acc = cfg.get_device(\"acc\")\n",
"gyro = cfg.get_device(\"gyro\")\n",
"sys.stdout.write(\" MLAB accelerometer sensor IMU01A module example \\r\\n\")\n",
"time.sleep(0.5)\n",
"gyro.route()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": "*"
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import sys\n",
"import time\n",
"from IPython.display import clear_output\n",
"\n",
"MEASUREMENTS = 100\n",
"list_meas = []\n",
"# acc.route() V p\u0159\u00edpad\u011b v\u00edce \u010didel je pot\u0159eba ke ka\u017ed\u00e9mu p\u0159ed jeho pou\u017eit\u00edm nechat vyroutovat cesutu na sb\u011brnici.\n",
"\n",
"for n in range(MEASUREMENTS):\n",
" clear_output()\n",
" (x, y, z) = gyro.axes()\n",
" list_meas.append([x, y, z])\n",
" print (n, list_meas[n])\n",
" sys.stdout.flush()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": "*"
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"measurements = np.array(list_meas)\n",
"\n",
"%pylab qt\n",
"plt.subplot(1, 1, 1)\n",
"plt.plot(measurements[:, 0])\n",
"plt.plot(measurements[:, 1])\n",
"plt.plot(measurements[:, 2])\n",
"plt.xlabel('sample number')\n",
"plt.ylabel('ADC')\n",
"plt.title('Raw sensors')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 5,
"text": [
"<matplotlib.text.Text at 0x7f67ec372650>"
]
}
],
"prompt_number": "*"
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"help(map)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Help on built-in function map in module __builtin__:\n",
"\n",
"map(...)\n",
" map(function, sequence[, sequence, ...]) -> list\n",
" \n",
" Return a list of the results of applying the function to the items of\n",
" the argument sequence(s). If more than one sequence is given, the\n",
" function is called with an argument list consisting of the corresponding\n",
" item of each sequence, substituting None for missing values when not all\n",
" sequences have the same length. If the function is None, return a list of\n",
" the items of the sequence (or a list of tuples if more than one sequence).\n",
"\n"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
/Modules/Sensors/IMU01A/SW/Python/calibration_data_3Dset.npz
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Modules/Sensors/IMU01A/SW/Python/calibration_utils.py
0,0 → 1,270
 
# Copyright (C) 2010 Antoine Drouin
#
# This file is part of Paparazzi.
#
# Paparazzi 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.
#
# Paparazzi is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Paparazzi; see the file COPYING. If not, write to
# the Free Software Foundation, 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
#
 
from __future__ import print_function, division
 
import re
import numpy as np
from numpy import sin, cos
from scipy import linalg, stats
 
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
 
 
def get_ids_in_log(filename):
"""Returns available ac_id from a log."""
f = open(filename, 'r')
ids = []
pattern = re.compile("\S+ (\S+)")
while True:
line = f.readline().strip()
if line == '':
break
m = re.match(pattern, line)
if m:
ac_id = m.group(1)
if not ac_id in ids:
ids.append(ac_id)
return ids
 
 
def read_log(ac_id, filename, sensor):
"""Extracts raw sensor measurements from a log."""
f = open(filename, 'r')
pattern = re.compile("(\S+) "+ac_id+" IMU_"+sensor+"_RAW (\S+) (\S+) (\S+)")
list_meas = []
while True:
line = f.readline().strip()
if line == '':
break
m = re.match(pattern, line)
if m:
list_meas.append([float(m.group(2)), float(m.group(3)), float(m.group(4))])
return np.array(list_meas)
 
 
def read_log_mag_current(ac_id, filename):
"""Extracts raw magnetometer and current measurements from a log."""
f = open(filename, 'r')
pattern = re.compile("(\S+) "+ac_id+" IMU_MAG_CURRENT_CALIBRATION (\S+) (\S+) (\S+) (\S+)")
list_meas = []
while True:
line = f.readline().strip()
if line == '':
break
m = re.match(pattern, line)
if m:
list_meas.append([float(m.group(2)), float(m.group(3)), float(m.group(4)), float(m.group(5))])
return np.array(list_meas)
 
 
def filter_meas(meas, window_size, noise_threshold):
"""Select only non-noisy data."""
filtered_meas = []
filtered_idx = []
for i in range(window_size, len(meas)-window_size):
noise = meas[i-window_size:i+window_size, :].std(axis=0)
if linalg.norm(noise) < noise_threshold:
filtered_meas.append(meas[i, :])
filtered_idx.append(i)
return np.array(filtered_meas), filtered_idx
 
 
def get_min_max_guess(meas, scale):
"""Initial boundary based calibration."""
max_meas = meas[:, :].max(axis=0)
min_meas = meas[:, :].min(axis=0)
n = (max_meas + min_meas) / 2
sf = 2*scale/(max_meas - min_meas)
return np.array([n[0], n[1], n[2], sf[0], sf[1], sf[2]])
 
 
def scale_measurements(meas, p):
"""Scale the set of measurements."""
l_comp = []
l_norm = []
for m in meas[:, ]:
sm = (m - p[0:3])*p[3:6]
l_comp.append(sm)
l_norm.append(linalg.norm(sm))
return np.array(l_comp), np.array(l_norm)
 
 
def estimate_mag_current_relation(meas):
"""Calculate linear coefficient of magnetometer-current relation."""
coefficient = []
for i in range(0, 3):
gradient, intercept, r_value, p_value, std_err = stats.linregress(meas[:, 3], meas[:, i])
coefficient.append(gradient)
return coefficient
 
 
def print_xml(p, sensor, res):
"""Print xml for airframe file."""
print("")
print("<define name=\""+sensor+"_X_NEUTRAL\" value=\""+str(int(round(p[0])))+"\"/>")
print("<define name=\""+sensor+"_Y_NEUTRAL\" value=\""+str(int(round(p[1])))+"\"/>")
print("<define name=\""+sensor+"_Z_NEUTRAL\" value=\""+str(int(round(p[2])))+"\"/>")
print("<define name=\""+sensor+"_X_SENS\" value=\""+str(p[3]*2**res)+"\" integer=\"16\"/>")
print("<define name=\""+sensor+"_Y_SENS\" value=\""+str(p[4]*2**res)+"\" integer=\"16\"/>")
print("<define name=\""+sensor+"_Z_SENS\" value=\""+str(p[5]*2**res)+"\" integer=\"16\"/>")
 
 
def plot_results(block, measurements, flt_idx, flt_meas, cp0, np0, cp1, np1, sensor_ref):
"""Plot calibration results."""
plt.subplot(3, 1, 1)
plt.plot(measurements[:, 0])
plt.plot(measurements[:, 1])
plt.plot(measurements[:, 2])
plt.plot(flt_idx, flt_meas[:, 0], 'ro')
plt.plot(flt_idx, flt_meas[:, 1], 'ro')
plt.plot(flt_idx, flt_meas[:, 2], 'ro')
plt.xlabel('time (s)')
plt.ylabel('ADC')
plt.title('Raw sensors')
 
plt.subplot(3, 2, 3)
plt.plot(cp0[:, 0])
plt.plot(cp0[:, 1])
plt.plot(cp0[:, 2])
plt.plot(-sensor_ref*np.ones(len(flt_meas)))
plt.plot(sensor_ref*np.ones(len(flt_meas)))
 
plt.subplot(3, 2, 4)
plt.plot(np0)
plt.plot(sensor_ref*np.ones(len(flt_meas)))
 
plt.subplot(3, 2, 5)
plt.plot(cp1[:, 0])
plt.plot(cp1[:, 1])
plt.plot(cp1[:, 2])
plt.plot(-sensor_ref*np.ones(len(flt_meas)))
plt.plot(sensor_ref*np.ones(len(flt_meas)))
 
plt.subplot(3, 2, 6)
plt.plot(np1)
plt.plot(sensor_ref*np.ones(len(flt_meas)))
 
# if we want to have another plot we only draw the figure (non-blocking)
# also in matplotlib before 1.0.0 there is only one call to show possible
if block:
plt.show()
else:
plt.draw()
 
 
def plot_mag_3d(measured, calibrated, p):
"""Plot magnetometer measurements on 3D sphere."""
# set up points for sphere and ellipsoid wireframes
u = np.r_[0:2 * np.pi:20j]
v = np.r_[0:np.pi:20j]
wx = np.outer(cos(u), sin(v))
wy = np.outer(sin(u), sin(v))
wz = np.outer(np.ones(np.size(u)), cos(v))
ex = p[0] * np.ones(np.size(u)) + np.outer(cos(u), sin(v)) / p[3]
ey = p[1] * np.ones(np.size(u)) + np.outer(sin(u), sin(v)) / p[4]
ez = p[2] * np.ones(np.size(u)) + np.outer(np.ones(np.size(u)), cos(v)) / p[5]
 
# measurements
mx = measured[:, 0]
my = measured[:, 1]
mz = measured[:, 2]
 
# calibrated values
cx = calibrated[:, 0]
cy = calibrated[:, 1]
cz = calibrated[:, 2]
 
# axes size
left = 0.02
bottom = 0.05
width = 0.46
height = 0.9
rect_l = [left, bottom, width, height]
rect_r = [left/2+0.5, bottom, width, height]
 
fig = plt.figure(figsize=plt.figaspect(0.5))
if matplotlib.__version__.startswith('0'):
ax = Axes3D(fig, rect=rect_l)
else:
ax = fig.add_subplot(1, 2, 1, position=rect_l, projection='3d')
# plot measurements
ax.scatter(mx, my, mz)
plt.hold(True)
# plot line from center to ellipsoid center
ax.plot([0.0, p[0]], [0.0, p[1]], [0.0, p[2]], color='black', marker='+', markersize=10)
# plot ellipsoid
ax.plot_wireframe(ex, ey, ez, color='grey', alpha=0.5)
 
# Create cubic bounding box to simulate equal aspect ratio
max_range = np.array([mx.max() - mx.min(), my.max() - my.min(), mz.max() - mz.min()]).max()
Xb = 0.5 * max_range * np.mgrid[-1:2:2, -1:2:2, -1:2:2][0].flatten() + 0.5 * (mx.max() + mx.min())
Yb = 0.5 * max_range * np.mgrid[-1:2:2, -1:2:2, -1:2:2][1].flatten() + 0.5 * (my.max() + my.min())
Zb = 0.5 * max_range * np.mgrid[-1:2:2, -1:2:2, -1:2:2][2].flatten() + 0.5 * (mz.max() + mz.min())
# add the fake bounding box:
for xb, yb, zb in zip(Xb, Yb, Zb):
ax.plot([xb], [yb], [zb], 'w')
 
ax.set_title('MAG raw with fitted ellipsoid and center offset')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
 
if matplotlib.__version__.startswith('0'):
ax = Axes3D(fig, rect=rect_r)
else:
ax = fig.add_subplot(1, 2, 2, position=rect_r, projection='3d')
ax.plot_wireframe(wx, wy, wz, color='grey', alpha=0.5)
plt.hold(True)
ax.scatter(cx, cy, cz)
 
ax.set_title('MAG calibrated on unit sphere')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_xlim3d(-1, 1)
ax.set_ylim3d(-1, 1)
ax.set_zlim3d(-1, 1)
plt.show()
 
 
def read_turntable_log(ac_id, tt_id, filename, _min, _max):
""" Read a turntable log.
return an array which first column is turnatble and next 3 are gyro
"""
f = open(filename, 'r')
pattern_g = re.compile("(\S+) "+str(ac_id)+" IMU_GYRO_RAW (\S+) (\S+) (\S+)")
pattern_t = re.compile("(\S+) "+str(tt_id)+" IMU_TURNTABLE (\S+)")
last_tt = None
list_tt = []
while True:
line = f.readline().strip()
if line == '':
break
m = re.match(pattern_t, line)
if m:
last_tt = float(m.group(2))
m = re.match(pattern_g, line)
if m and last_tt and _min < last_tt < _max:
list_tt.append([last_tt, float(m.group(2)), float(m.group(3)), float(m.group(4))])
return np.array(list_tt)
/Modules/Sensors/IMU01A/SW/Python/calibration_data_set.npz
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Modules/Sensors/IMU01A/SW/PIC16F887/Gyroskop/main.bak
0,0 → 1,20
#include "C:\Users\Honza\Documents\pic\I2C_gyrsokop\main.h"
 
 
 
 
void main()
{
 
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
 
//TODO: User Code
 
}
/Modules/Sensors/IMU01A/SW/PIC16F887/Gyroskop/main.c
0,0 → 1,70
#include "C:\Users\Honza\Documents\pic\I2C_magnetometr\main.h"
#define EEPROM_SDA PIN_B0
#define EEPROM_SCL PIN_B1
#use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)
#use rs232(baud=9600,parity=N,xmit=PIN_B3,rcv=PIN_B2,bits=8) //rcv TXD xmit RXD
 
 
void main()
{
 
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
 
printf("Simple Thermomether \r\n",);
 
int STAV1;
unsigned int data1;
 
while(TRUE)
{
 
 
//akcelerometr
int1 ack;
i2c_start(); // If the write command is acknowledged,
ack = i2c_write(0xD1);// then the device is ready.
i2c_stop();
ack=!ack;
i2c_stop();
 
i2c_start();
I2C_Write(0xD0);
I2C_write(0x28);
i2c_stop();
i2c_start();
I2C_Write(0xD1);
STAV1=i2c_read(0);
i2c_stop();
 
i2c_start();
I2C_Write(0xD0);
I2C_write(0x0F);
i2c_stop();
i2c_start();
I2C_Write(0xD1);
data1=i2c_read(0);
i2c_stop();
 
 
 
printf("Stav: %d (procenta)\r\n", ack);
printf("Stav: %d (procenta)\r\n", STAV1);
printf("Stav: %du(procenta)\r\n", data1);
delay_ms (2000);
 
}
}
/Modules/Sensors/IMU01A/SW/PIC16F887/Gyroskop/main.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Modules/Sensors/IMU01A/SW/PIC16F887/Gyroskop/main.err
0,0 → 1,2
Memory usage: ROM=10% RAM=2% - 5%
0 Errors, 0 Warnings.
/Modules/Sensors/IMU01A/SW/PIC16F887/Gyroskop/main.esym
0,0 → 1,417
D G "__PCM__" 0 72 ""4.106""
D G "__DEVICE__" 0 72 "887"
D G "__DATE__" 0 72 ""02-4-13""
D G "__TIME__" 0 72 ""10:53:48"" "Standard Header file for the PIC16F887 device ////////////////"
d G "PIN_A0" 2 20 "40"
d G "PIN_A1" 2 21 "41"
d G "PIN_A2" 2 22 "42"
d G "PIN_A3" 2 23 "43"
d G "PIN_A4" 2 24 "44"
d G "PIN_A5" 2 25 "45"
d G "PIN_A6" 2 26 "46"
d G "PIN_A7" 2 27 "47"
d G "PIN_B0" 2 29 "48"
d G "PIN_B1" 2 30 "49"
d G "PIN_B2" 2 31 "50"
d G "PIN_B3" 2 32 "51"
d G "PIN_B4" 2 33 "52"
d G "PIN_B5" 2 34 "53"
d G "PIN_B6" 2 35 "54"
d G "PIN_B7" 2 36 "55"
d G "PIN_C0" 2 38 "56"
d G "PIN_C1" 2 39 "57"
d G "PIN_C2" 2 40 "58"
d G "PIN_C3" 2 41 "59"
d G "PIN_C4" 2 42 "60"
d G "PIN_C5" 2 43 "61"
d G "PIN_C6" 2 44 "62"
d G "PIN_C7" 2 45 "63"
d G "PIN_D0" 2 47 "64"
d G "PIN_D1" 2 48 "65"
d G "PIN_D2" 2 49 "66"
d G "PIN_D3" 2 50 "67"
d G "PIN_D4" 2 51 "68"
d G "PIN_D5" 2 52 "69"
d G "PIN_D6" 2 53 "70"
d G "PIN_D7" 2 54 "71"
d G "PIN_E0" 2 56 "72"
d G "PIN_E1" 2 57 "73"
d G "PIN_E2" 2 58 "74"
d G "PIN_E3" 2 59 "75"
d G "FALSE" 2 62 "0"
d G "TRUE" 2 63 "1"
d G "BYTE" 2 65 "int8"
d G "BOOLEAN" 2 66 "int1"
d G "getc" 2 68 "getch"
d G "fgetc" 2 69 "getch"
d G "getchar" 2 70 "getch"
d G "putc" 2 71 "putchar"
d G "fputc" 2 72 "putchar"
d G "fgets" 2 73 "gets"
d G "fputs" 2 74 "puts"
d G "WDT_FROM_SLEEP" 2 79 "3"
d G "WDT_TIMEOUT" 2 80 "11"
d G "MCLR_FROM_SLEEP" 2 81 "19"
d G "MCLR_FROM_RUN" 2 82 "27"
d G "NORMAL_POWER_UP" 2 83 "25"
d G "BROWNOUT_RESTART" 2 84 "26"
d G "T0_INTERNAL" 2 91 "0"
d G "T0_EXT_L_TO_H" 2 92 "32"
d G "T0_EXT_H_TO_L" 2 93 "48"
d G "T0_DIV_1" 2 95 "8"
d G "T0_DIV_2" 2 96 "0"
d G "T0_DIV_4" 2 97 "1"
d G "T0_DIV_8" 2 98 "2"
d G "T0_DIV_16" 2 99 "3"
d G "T0_DIV_32" 2 100 "4"
d G "T0_DIV_64" 2 101 "5"
d G "T0_DIV_128" 2 102 "6"
d G "T0_DIV_256" 2 103 "7"
d G "T0_8_BIT" 2 106 "0"
d G "RTCC_INTERNAL" 2 108 "0" "The following are provided for compatibility"
d G "RTCC_EXT_L_TO_H" 2 109 "32" "with older compiler versions"
d G "RTCC_EXT_H_TO_L" 2 110 "48"
d G "RTCC_DIV_1" 2 111 "8"
d G "RTCC_DIV_2" 2 112 "0"
d G "RTCC_DIV_4" 2 113 "1"
d G "RTCC_DIV_8" 2 114 "2"
d G "RTCC_DIV_16" 2 115 "3"
d G "RTCC_DIV_32" 2 116 "4"
d G "RTCC_DIV_64" 2 117 "5"
d G "RTCC_DIV_128" 2 118 "6"
d G "RTCC_DIV_256" 2 119 "7"
d G "RTCC_8_BIT" 2 120 "0"
d G "WDT_18MS" 2 132 "8"
d G "WDT_36MS" 2 133 "9"
d G "WDT_72MS" 2 134 "10"
d G "WDT_144MS" 2 135 "11"
d G "WDT_288MS" 2 136 "12"
d G "WDT_576MS" 2 137 "13"
d G "WDT_1152MS" 2 138 "14"
d G "WDT_2304MS" 2 139 "15"
d G "WDT_ON" 2 143 "0x4100"
d G "WDT_OFF" 2 144 "0"
d G "WDT_DIV_16" 2 145 "0x100"
d G "WDT_DIV_8" 2 146 "0x300"
d G "WDT_DIV_4" 2 147 "0x500"
d G "WDT_DIV_2" 2 148 "0x700"
d G "WDT_TIMES_1" 2 149 "0x900" "Default"
d G "WDT_TIMES_2" 2 150 "0xB00"
d G "WDT_TIMES_4" 2 151 "0xD00"
d G "WDT_TIMES_8" 2 152 "0xF00"
d G "WDT_TIMES_16" 2 153 "0x1100"
d G "WDT_TIMES_32" 2 154 "0x1300"
d G "WDT_TIMES_64" 2 155 "0x1500"
d G "WDT_TIMES_128" 2 156 "0x1700"
d G "T1_DISABLED" 2 162 "0"
d G "T1_INTERNAL" 2 163 "5"
d G "T1_EXTERNAL" 2 164 "7"
d G "T1_EXTERNAL_SYNC" 2 165 "3"
d G "T1_CLK_OUT" 2 167 "8"
d G "T1_DIV_BY_1" 2 169 "0"
d G "T1_DIV_BY_2" 2 170 "0x10"
d G "T1_DIV_BY_4" 2 171 "0x20"
d G "T1_DIV_BY_8" 2 172 "0x30"
d G "T1_GATE" 2 174 "0x40"
d G "T1_GATE_INVERTED" 2 175 "0xC0"
d G "T2_DISABLED" 2 180 "0"
d G "T2_DIV_BY_1" 2 181 "4"
d G "T2_DIV_BY_4" 2 182 "5"
d G "T2_DIV_BY_16" 2 183 "6"
d G "CCP_OFF" 2 189 "0"
d G "CCP_CAPTURE_FE" 2 190 "4"
d G "CCP_CAPTURE_RE" 2 191 "5"
d G "CCP_CAPTURE_DIV_4" 2 192 "6"
d G "CCP_CAPTURE_DIV_16" 2 193 "7"
d G "CCP_COMPARE_SET_ON_MATCH" 2 194 "8"
d G "CCP_COMPARE_CLR_ON_MATCH" 2 195 "9"
d G "CCP_COMPARE_INT" 2 196 "0xA"
d G "CCP_COMPARE_RESET_TIMER" 2 197 "0xB"
d G "CCP_PWM" 2 198 "0xC"
d G "CCP_PWM_PLUS_1" 2 199 "0x1c"
d G "CCP_PWM_PLUS_2" 2 200 "0x2c"
d G "CCP_PWM_PLUS_3" 2 201 "0x3c"
d G "CCP_PWM_H_H" 2 206 "0x0c"
d G "CCP_PWM_H_L" 2 207 "0x0d"
d G "CCP_PWM_L_H" 2 208 "0x0e"
d G "CCP_PWM_L_L" 2 209 "0x0f"
d G "CCP_PWM_FULL_BRIDGE" 2 211 "0x40"
d G "CCP_PWM_FULL_BRIDGE_REV" 2 212 "0xC0"
d G "CCP_PWM_HALF_BRIDGE" 2 213 "0x80"
d G "CCP_SHUTDOWN_ON_COMP1" 2 215 "0x100000"
d G "CCP_SHUTDOWN_ON_COMP2" 2 216 "0x200000"
d G "CCP_SHUTDOWN_ON_COMP" 2 217 "0x300000"
d G "CCP_SHUTDOWN_ON_INT0" 2 218 "0x400000"
d G "CCP_SHUTDOWN_ON_COMP1_INT0" 2 219 "0x500000"
d G "CCP_SHUTDOWN_ON_COMP2_INT0" 2 220 "0x600000"
d G "CCP_SHUTDOWN_ON_COMP_INT0" 2 221 "0x700000"
d G "CCP_SHUTDOWN_AC_L" 2 223 "0x000000"
d G "CCP_SHUTDOWN_AC_H" 2 224 "0x040000"
d G "CCP_SHUTDOWN_AC_F" 2 225 "0x080000"
d G "CCP_SHUTDOWN_BD_L" 2 227 "0x000000"
d G "CCP_SHUTDOWN_BD_H" 2 228 "0x010000"
d G "CCP_SHUTDOWN_BD_F" 2 229 "0x020000"
d G "CCP_SHUTDOWN_RESTART" 2 231 "0x80000000"
d G "CCP_PULSE_STEERING_A" 2 233 "0x01000000"
d G "CCP_PULSE_STEERING_B" 2 234 "0x02000000"
d G "CCP_PULSE_STEERING_C" 2 235 "0x04000000"
d G "CCP_PULSE_STEERING_D" 2 236 "0x08000000"
d G "CCP_PULSE_STEERING_SYNC" 2 237 "0x10000000"
d G "SPI_MASTER" 2 245 "0x20"
d G "SPI_SLAVE" 2 246 "0x24"
d G "SPI_L_TO_H" 2 247 "0"
d G "SPI_H_TO_L" 2 248 "0x10"
d G "SPI_CLK_DIV_4" 2 249 "0"
d G "SPI_CLK_DIV_16" 2 250 "1"
d G "SPI_CLK_DIV_64" 2 251 "2"
d G "SPI_CLK_T2" 2 252 "3"
d G "SPI_SS_DISABLED" 2 253 "1"
d G "SPI_SAMPLE_AT_END" 2 255 "0x8000"
d G "SPI_XMIT_L_TO_H" 2 256 "0x4000"
d G "UART_ADDRESS" 2 262 "2"
d G "UART_DATA" 2 263 "4"
d G "UART_AUTODETECT" 2 264 "8"
d G "UART_AUTODETECT_NOWAIT" 2 265 "9"
d G "UART_WAKEUP_ON_RDA" 2 266 "10"
d G "UART_SEND_BREAK" 2 267 "13"
d G "NC_NC_NC_NC" 2 273 "0x00"
d G "NC_NC" 2 274 "0x00"
d G "CP1_A0_A3" 2 277 "0x00090080"
d G "CP1_A1_A3" 2 278 "0x000A0081"
d G "CP1_B3_A3" 2 279 "0x00880082"
d G "CP1_B1_A3" 2 280 "0x00280083"
d G "CP1_A0_VREF" 2 281 "0x00010084"
d G "CP1_A1_VREF" 2 282 "0x00020085"
d G "CP1_B3_VREF" 2 283 "0x00800086"
d G "CP1_B1_VREF" 2 284 "0x00200087"
d G "CP1_OUT_ON_A4" 2 286 "0x00000020"
d G "CP1_INVERT" 2 287 "0x00000010"
d G "CP1_ABSOLUTE_VREF" 2 288 "0x20000000"
d G "CP2_A0_A2" 2 291 "0x00058000"
d G "CP2_A1_A2" 2 292 "0x00068100"
d G "CP2_B3_A2" 2 293 "0x00848200"
d G "CP2_B1_A2" 2 294 "0x00248300"
d G "CP2_A0_VREF" 2 295 "0x00018400"
d G "CP2_A1_VREF" 2 296 "0x00028500"
d G "CP2_B3_VREF" 2 297 "0x00808600"
d G "CP2_B1_VREF" 2 298 "0x00208700"
d G "CP2_OUT_ON_A5" 2 300 "0x00002000"
d G "CP2_INVERT" 2 301 "0x00001000"
d G "CP2_ABSOLUTE_VREF" 2 302 "0x10000000"
d G "CP2_T1_SYNC" 2 305 "0x01000000"
d G "CP2_T1_GATE" 2 306 "0x02000000"
d G "VREF_LOW" 2 315 "0xa0"
d G "VREF_HIGH" 2 316 "0x80"
d G "OSC_31KHZ" 2 322 "1"
d G "OSC_125KHZ" 2 323 "0x11"
d G "OSC_250KHZ" 2 324 "0x21"
d G "OSC_500KHZ" 2 325 "0x31"
d G "OSC_1MHZ" 2 326 "0x41"
d G "OSC_2MHZ" 2 327 "0x51"
d G "OSC_4MHZ" 2 328 "0x61"
d G "OSC_8MHZ" 2 329 "0x71"
d G "OSC_INTRC" 2 330 "1"
d G "OSC_NORMAL" 2 331 "0"
d G "OSC_STATE_STABLE" 2 333 "4"
d G "OSC_31KHZ_STABLE" 2 334 "2"
d G "ADC_OFF" 2 342 "0" "ADC Off"
d G "ADC_CLOCK_DIV_2" 2 343 "0x100"
d G "ADC_CLOCK_DIV_8" 2 344 "0x40"
d G "ADC_CLOCK_DIV_32" 2 345 "0x80"
d G "ADC_CLOCK_INTERNAL" 2 346 "0xc0" "Internal 2-6us"
d G "sAN0" 2 350 "1" "| A0"
d G "sAN1" 2 351 "2" "| A1"
d G "sAN2" 2 352 "4" "| A2"
d G "sAN3" 2 353 "8" "| A3"
d G "sAN4" 2 354 "16" "| A5"
d G "sAN5" 2 355 "32" "| E0"
d G "sAN6" 2 356 "64" "| E1"
d G "sAN7" 2 357 "128" "| E2"
d G "sAN8" 2 358 "0x10000" "| B2"
d G "sAN9" 2 359 "0x20000" "| B3"
d G "sAN10" 2 360 "0x40000" "| B1"
d G "sAN11" 2 361 "0x80000" "| B4"
d G "sAN12" 2 362 "0x100000" "| B0"
d G "sAN13" 2 363 "0x200000" "| B5"
d G "NO_ANALOGS" 2 364 "0" "None"
d G "ALL_ANALOG" 2 365 "0x1F00FF" "A0 A1 A2 A3 A5 E0 E1 E2 B0 B1 B2 B3 B4 B5"
d G "VSS_VDD" 2 368 "0x0000" "| Range 0-Vdd"
d G "VSS_VREF" 2 369 "0x1000" "| Range 0-Vref"
d G "VREF_VREF" 2 370 "0x3000" "| Range Vref-Vref"
d G "VREF_VDD" 2 371 "0x2000" "| Range Vref-Vdd"
d G "ADC_START_AND_READ" 2 375 "7" "This is the default if nothing is specified"
d G "ADC_START_ONLY" 2 376 "1"
d G "ADC_READ_ONLY" 2 377 "6"
d G "L_TO_H" 2 389 "0x40"
d G "H_TO_L" 2 390 "0"
d G "GLOBAL" 2 392 "0x0BC0"
d G "INT_RTCC" 2 393 "0x000B20"
d G "INT_RB" 2 394 "0x01FF0B08"
d G "INT_EXT_L2H" 2 395 "0x50000B10"
d G "INT_EXT_H2L" 2 396 "0x60000B10"
d G "INT_EXT" 2 397 "0x000B10"
d G "INT_AD" 2 398 "0x008C40"
d G "INT_TBE" 2 399 "0x008C10"
d G "INT_RDA" 2 400 "0x008C20"
d G "INT_TIMER1" 2 401 "0x008C01"
d G "INT_TIMER2" 2 402 "0x008C02"
d G "INT_CCP1" 2 403 "0x008C04"
d G "INT_CCP2" 2 404 "0x008D01"
d G "INT_SSP" 2 405 "0x008C08"
d G "INT_BUSCOL" 2 406 "0x008D08"
d G "INT_EEPROM" 2 407 "0x008D10"
d G "INT_TIMER0" 2 408 "0x000B20"
d G "INT_OSC_FAIL" 2 409 "0x008D80"
d G "INT_COMP" 2 410 "0x008D20"
d G "INT_COMP2" 2 411 "0x008D40"
d G "INT_ULPWU" 2 412 "0x008D04"
d G "INT_RB0" 2 413 "0x0010B08"
d G "INT_RB1" 2 414 "0x0020B08"
d G "INT_RB2" 2 415 "0x0040B08"
d G "INT_RB3" 2 416 "0x0080B08"
d G "INT_RB4" 2 417 "0x0100B08"
d G "INT_RB5" 2 418 "0x0200B08"
d G "INT_RB6" 2 419 "0x0400B08"
d G "INT_RB7" 2 420 "0x0800B08"
D G "EEPROM_SDA" 0 2 "PIN_B0"
D G "EEPROM_SCL" 0 3 "PIN_B1"
F G "main" 0 8 "void()"
C L "main" 0 18 1 "FUNCTION"
V L "STAV1" 0 22 "int8"
V L "data1" 0 23 "int8"
C L "main" 0 18 1 "FUNCTION"
V L "ack" 0 32 "int1"
C L "main" 0 18 1 "FUNCTION"
C L "main" 0 18 1 "FUNCTION"
F B "reset_cpu" 0 0
F B "abs" 1 0
F B "sleep_ulpwu" 1 0
F B "sleep" 0 0
F B "delay_cycles" 1 0
F B "read_bank" 2 0
F B "write_bank" 3 0
F B "shift_left" 2 2
F B "shift_right" 2 2
F B "rotate_left" 2 0
F B "rotate_right" 2 0
F B "_mul" 2 0
F B "memset" 3 0
F B "isamoung" 2 0
F B "isamong" 2 0
F B "bit_set" 2 0
F B "bit_clear" 2 0
F B "bit_test" 2 0
F B "toupper" 1 0
F B "tolower" 1 0
F B "swap" 1 0
F B "printf" 1 255
F B "fprintf" 1 255
F B "sprintf" 1 255
F B "make8" 2 0
F B "make16" 2 0
F B "make32" 1 255
F B "label_address" 1 1
F B "goto_address" 1 0
F B "_va_arg" 1 0
F B "offsetofbit" 2 2
F B "enable_interrupts" 1 0
F B "disable_interrupts" 1 0
F B "interrupt_active" 1 0
F B "clear_interrupt" 1 0
F B "jump_to_isr" 1 0
F B "ext_int_edge" 1 2
F B "read_eeprom" 1 0
F B "write_eeprom" 2 0
F B "read_program_eeprom" 1 0
F B "write_program_eeprom" 2 0
F B "write_program_memory" 4 0
F B "write_program_memory8" 4 0
F B "read_program_memory" 4 0
F B "read_program_memory8" 4 0
F B "erase_program_eeprom" 1 0
F B "strcpy" 2 0
F B "memcpy" 3 0
F B "strstr100" 2 0
F B "output_high" 1 0
F B "output_low" 1 0
F B "input" 1 0
F B "input_state" 1 0
F B "output_float" 1 0
F B "output_drive" 1 0
F B "output_bit" 1 1
F B "output_toggle" 1 0
F B "output_a" 1 0
F B "output_b" 1 0
F B "output_c" 1 0
F B "output_d" 1 0
F B "output_e" 1 0
F B "input_a" 0 0
F B "input_b" 0 0
F B "input_c" 0 0
F B "input_d" 0 0
F B "input_e" 0 0
F B "set_tris_a" 1 0
F B "set_tris_b" 1 0
F B "set_tris_c" 1 0
F B "set_tris_d" 1 0
F B "set_tris_e" 1 0
F B "get_tris_a" 0 0
F B "get_tris_b" 0 0
F B "get_tris_c" 0 0
F B "get_tris_d" 0 0
F B "get_tris_e" 0 0
F B "input_change_a" 0 0
F B "input_change_b" 0 0
F B "input_change_c" 0 0
F B "input_change_d" 0 0
F B "input_change_e" 0 0
F B "port_b_pullups" 1 0
F B "setup_counters" 2 0
F B "setup_wdt" 1 0
F B "restart_cause" 0 0
F B "restart_wdt" 0 0
F B "get_rtcc" 0 0
F B "set_rtcc" 1 0
F B "get_timer0" 0 0
F B "set_timer0" 1 0
F B "setup_comparator" 1 0
F B "setup_port_a" 1 0
F B "setup_adc_ports" 1 0
F B "setup_adc" 1 0
F B "set_adc_channel" 1 0
F B "read_adc" 0 1
F B "adc_done" 0 0
F B "setup_timer_0" 1 0
F B "setup_vref" 1 0
F B "setup_timer_1" 1 0
F B "get_timer1" 0 0
F B "set_timer1" 1 0
F B "setup_timer_2" 3 0
F B "get_timer2" 0 0
F B "set_timer2" 1 0
F B "setup_ccp1" 1 2
F B "set_pwm1_duty" 1 0
F B "setup_ccp2" 1 0
F B "set_pwm2_duty" 1 0
F B "setup_oscillator" 1 2
F B "setup_spi" 1 0
F B "spi_read" 0 1
F B "spi_write" 1 0
F B "spi_data_is_in" 0 0
F B "setup_spi2" 1 0
F B "spi_read2" 0 1
F B "spi_write2" 1 0
F B "spi_data_is_in2" 0 0
F B "brownout_enable" 1 0
F B "delay_ms" 1 0
F B "delay_us" 1 0
F B "i2c_read" 0 2
F B "i2c_write" 1 2
F B "i2c_start" 0 2
F B "i2c_stop" 0 1
F B "i2c_isr_state" 0 1
F B "putchar" 1 2
F B "puts" 1 2
F B "getch" 0 1
F B "gets" 1 3
F B "kbhit" 0 1
/Modules/Sensors/IMU01A/SW/PIC16F887/Gyroskop/main.h
0,0 → 1,19
#include <16F887.h>
#device adc=8
 
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES BORV40 //Brownout reset at 4.0V
 
#use delay(clock=8000000)
 
/Modules/Sensors/IMU01A/SW/PIC16F887/Gyroskop/main.hex
0,0 → 1,112
:1000000001308A00E1290000D3346D38EC32202A17
:10001000E832F236EF36653AE8327210A0060A008E
:10002000533A613B3A10253220147039EF3165376D
:10003000F430A9060A00533A613B3A1025322014E5
:100040007039EF316537F430A9060A00533A613B45
:100050003A10253275147039EF316537F430A9063E
:100060000A0083168611831286110830F80038289A
:100070000000F8174928F813AB0C03188615031C69
:100080008611781749287813F80B3C284728000078
:1000900086153F308400840B4B280000F81B3B285A
:1000A000781B43280800831603178C170C140000D4
:1000B000000083120C087F39031997280313A4004A
:1000C00003170D080313A50003170F080313A60059
:1000D0002408AB003120250803178D0003132608E0
:1000E00003178F0083168C170C1400000000831276
:1000F0000C0D0E0D7F39031997280313A400031765
:100100000D080313A50003170F080313A600240806
:10011000AB003120250803178D00031326080317B1
:100120008F008D0A03198F0A031353280317031333
:100130008A110A12492A0830F80000008610831636
:10014000861000008312A40D0610031CAA28831633
:10015000061483120318AF28831606108312831621
:1001600086148312861CB228F80B9D280000861086
:100170008316861000000614000000008614831207
:10018000861CC028F8010000061878148610831613
:10019000861083120610831606108312080008309A
:1001A000A5007708A60083160614000086148312A3
:1001B000861CD82806180314061C0310F80D00002E
:1001C0008316861083128610A50BD3288316061477
:1001D00000008312061026080319F1288316061062
:1001E00083120000831686148312861CF5280000F3
:1001F00086108316861000008312061083160610E0
:1002000083120800831603178C170C1400000000DB
:100210000318312983120C087F390313A600031732
:100220000D080313A70003170F080313A8002608DF
:10023000AB003120270803178D000313280803178C
:100240008F0083168C170C14000000008312031318
:10025000A50B2B292E298316031731295029831624
:10026000031783120C0D0E0D7F390313A60003171D
:100270000D080313A70003170F080313A80026088F
:10028000AB003120270803178D000313280803173C
:100290008F008D0A03198F0A03100313A50B02297F
:1002A00008002C08F8012B02031859292B08F70025
:1002B0006529F7010830AD00AB0DF70D2C0877026A
:1002C0000318F700F80DAD0B5C2908002030261E3E
:1002D0003030A7002508F700A51F7529F709F70A90
:1002E0007708A5002D30A700A6172508AB006430BD
:1002F000AC0051217708A50030307807A800250808
:10030000AB000A30AC00512130307707AA00303002
:100310007807A9002708F700A61D9029A61F261117
:10032000261A9D29A61FB8292619B8297708A800DA
:10033000A618B8297708A900B82930302802031D6B
:10034000B8297708A8002030A700A61DAB292611E0
:10035000A614A61FA61030302902031DB82977085D
:10036000A9002030A800A61DAB29A610A61F2610A4
:10037000261DBD292708AB003120A61CC22928084C
:10038000AB003120261CC7292908AB0031202A08E0
:10039000AB003120080025308400831300080319C6
:1003A000DE290230F800F701F70BD429F80BD32926
:1003B0009730F700F70BDA29800BD1298A110A123E
:1003C000572B840183131F308305713083168F00F0
:1003D0000F08861183128615831603170908C03982
:1003E000890003131F129F12003003178800831225
:1003F000870188018901FF300313A00083160317CA
:100400000908C039890003131F129F120030031717
:100410008800831203131F139F1383169F138312E5
:100420001F149412A012200883168700831220162E
:100430002008831687008312A011200883168700E6
:100440000130831294000030831694000108C739EC
:1004500008388100831290010030F80092000030CB
:1004600083169200831220152008831687008312BA
:10047000970183169B019C0101309D008312031795
:1004800087018801890104308D0000308F0003133B
:1004900053288316061400008614000083120610E9
:1004A0008316061000008312861083168610D13042
:1004B0008312A4009B207808231078182314831635
:1004C0000610000086148312861C642A0000682A25
:1004D000000083160614000001308312A306831661
:1004E0000610000086148312861C742A0000782AE5
:1004F0000000831606140000061400008614000095
:1005000083120610831606100000831286108316CD
:100510008610D0308312A4009B202830A4009B209A
:1005200083160610000086148312861C952A00008C
:10053000992A000083160614000006140000861491
:100540000000831206108316061000008312861026
:1005500083168610D1308312A4009B20F701CF2090
:100560007808A10083160610000086148312861CEA
:10057000B72A0000BB2A00008316061400000614E8
:100580000000861400008312061083160610000077
:100590008312861083168610D0308312A4009B200D
:1005A0000F30A4009B2083160610000086148312CF
:1005B000861CD82A0000DC2A0000831606140000DE
:1005C000061400008614000083120610831606101D
:1005D00000008312861083168610D1308312A40087
:1005E0009B20F701CF207808A20083160610000098
:1005F00086148312861CFA2A0000FE2A0000831645
:10060000061400000030831223180130A4001030BB
:1006100003178D0000308F00031006300313A50070
:1006200002212408A5001F30A600662114300317FC
:100630008D0000308F0003100D300313A500022140
:100640001B3003178D0000308F000310063003139A
:10065000A50002212108A5001F30A60066211F3039
:1006600003178D0000308F0003100D300313A50019
:100670000221263003178D0000308F000310063052
:100680000313A50002212208A5001F30A600662141
:100690002A3003178D0000308F0003100D30031334
:1006A000A50002210830A400FA30A500CB29A40B34
:0606B000542B492A6300EF
:04400E00F52CFF3F4F
:00000001FF
;PIC16F887
;CRC=CFC6 CREATED="02-4-13 10:53"
/Modules/Sensors/IMU01A/SW/PIC16F887/Gyroskop/main.lst
0,0 → 1,652
CCS PCM C Compiler, Version 4.106, 47914 02-4-13 10:53
 
Filename: C:\Users\Honza\Documents\pic\I2C_gyrsokop\main.lst
 
ROM used: 859 words (10%)
Largest free fragment is 2048
RAM used: 7 (2%) at main() level
19 (5%) worst case
Stack: 2 locations
 
*
0000: MOVLW 01
0001: MOVWF 0A
0002: GOTO 1E1
0003: NOP
.................... #include "C:\Users\Honza\Documents\pic\I2C_magnetometr\main.h"
.................... #include <16F887.h>
.................... //////// Standard Header file for the PIC16F887 device ////////////////
.................... #device PIC16F887
.................... #list
....................
.................... #device adc=8
....................
.................... #FUSES NOWDT //No Watch Dog Timer
.................... #FUSES INTRC //Internal RC Osc
.................... #FUSES NOPUT //No Power Up Timer
.................... #FUSES MCLR //Master Clear pin enabled
.................... #FUSES NOPROTECT //Code not protected from reading
.................... #FUSES NOCPD //No EE protection
.................... #FUSES NOBROWNOUT //No brownout reset
.................... #FUSES IESO //Internal External Switch Over mode enabled
.................... #FUSES FCMEN //Fail-safe clock monitor enabled
.................... #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
.................... #FUSES NODEBUG //No Debug mode for ICD
.................... #FUSES NOWRT //Program memory not write protected
.................... #FUSES BORV40 //Brownout reset at 4.0V
....................
.................... #use delay(clock=8000000)
*
01CB: MOVLW 25
01CC: MOVWF 04
01CD: BCF 03.7
01CE: MOVF 00,W
01CF: BTFSC 03.2
01D0: GOTO 1DE
01D1: MOVLW 02
01D2: MOVWF 78
01D3: CLRF 77
01D4: DECFSZ 77,F
01D5: GOTO 1D4
01D6: DECFSZ 78,F
01D7: GOTO 1D3
01D8: MOVLW 97
01D9: MOVWF 77
01DA: DECFSZ 77,F
01DB: GOTO 1DA
01DC: DECFSZ 00,F
01DD: GOTO 1D1
01DE: BCF 0A.3
01DF: BCF 0A.4
01E0: GOTO 357 (RETURN)
....................
....................
.................... #define EEPROM_SDA PIN_B0
.................... #define EEPROM_SCL PIN_B1
.................... #use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)
*
009B: MOVLW 08
009C: MOVWF 78
009D: NOP
009E: BCF 06.1
009F: BSF 03.5
00A0: BCF 06.1
00A1: NOP
00A2: BCF 03.5
00A3: RLF 24,F
00A4: BCF 06.0
00A5: BTFSS 03.0
00A6: GOTO 0AA
00A7: BSF 03.5
00A8: BSF 06.0
00A9: BCF 03.5
00AA: BTFSC 03.0
00AB: GOTO 0AF
00AC: BSF 03.5
00AD: BCF 06.0
00AE: BCF 03.5
00AF: BSF 03.5
00B0: BSF 06.1
00B1: BCF 03.5
00B2: BTFSS 06.1
00B3: GOTO 0B2
00B4: DECFSZ 78,F
00B5: GOTO 09D
00B6: NOP
00B7: BCF 06.1
00B8: BSF 03.5
00B9: BCF 06.1
00BA: NOP
00BB: BSF 06.0
00BC: NOP
00BD: NOP
00BE: BSF 06.1
00BF: BCF 03.5
00C0: BTFSS 06.1
00C1: GOTO 0C0
00C2: CLRF 78
00C3: NOP
00C4: BTFSC 06.0
00C5: BSF 78.0
00C6: BCF 06.1
00C7: BSF 03.5
00C8: BCF 06.1
00C9: BCF 03.5
00CA: BCF 06.0
00CB: BSF 03.5
00CC: BCF 06.0
00CD: BCF 03.5
00CE: RETURN
00CF: MOVLW 08
00D0: MOVWF 25
00D1: MOVF 77,W
00D2: MOVWF 26
00D3: BSF 03.5
00D4: BSF 06.0
00D5: NOP
00D6: BSF 06.1
00D7: BCF 03.5
00D8: BTFSS 06.1
00D9: GOTO 0D8
00DA: BTFSC 06.0
00DB: BSF 03.0
00DC: BTFSS 06.0
00DD: BCF 03.0
00DE: RLF 78,F
00DF: NOP
00E0: BSF 03.5
00E1: BCF 06.1
00E2: BCF 03.5
00E3: BCF 06.1
00E4: DECFSZ 25,F
00E5: GOTO 0D3
00E6: BSF 03.5
00E7: BSF 06.0
00E8: NOP
00E9: BCF 03.5
00EA: BCF 06.0
00EB: MOVF 26,W
00EC: BTFSC 03.2
00ED: GOTO 0F1
00EE: BSF 03.5
00EF: BCF 06.0
00F0: BCF 03.5
00F1: NOP
00F2: BSF 03.5
00F3: BSF 06.1
00F4: BCF 03.5
00F5: BTFSS 06.1
00F6: GOTO 0F5
00F7: NOP
00F8: BCF 06.1
00F9: BSF 03.5
00FA: BCF 06.1
00FB: NOP
00FC: BCF 03.5
00FD: BCF 06.0
00FE: BSF 03.5
00FF: BCF 06.0
0100: BCF 03.5
0101: RETURN
.................... #use rs232(baud=9600,parity=N,xmit=PIN_B3,rcv=PIN_B2,bits=8) //rcv TXD xmit RXD
*
0031: BSF 03.5
0032: BCF 06.3
0033: BCF 03.5
0034: BCF 06.3
0035: MOVLW 08
0036: MOVWF 78
0037: GOTO 038
0038: NOP
0039: BSF 78.7
003A: GOTO 049
003B: BCF 78.7
003C: RRF 2B,F
003D: BTFSC 03.0
003E: BSF 06.3
003F: BTFSS 03.0
0040: BCF 06.3
0041: BSF 78.6
0042: GOTO 049
0043: BCF 78.6
0044: DECFSZ 78,F
0045: GOTO 03C
0046: GOTO 047
0047: NOP
0048: BSF 06.3
0049: MOVLW 3F
004A: MOVWF 04
004B: DECFSZ 04,F
004C: GOTO 04B
004D: NOP
004E: BTFSC 78.7
004F: GOTO 03B
0050: BTFSC 78.6
0051: GOTO 043
0052: RETURN
....................
....................
.................... void main()
.................... {
*
01E1: CLRF 04
01E2: BCF 03.7
01E3: MOVLW 1F
01E4: ANDWF 03,F
01E5: MOVLW 71
01E6: BSF 03.5
01E7: MOVWF 0F
01E8: MOVF 0F,W
01E9: BCF 06.3
01EA: BCF 03.5
01EB: BSF 06.3
01EC: BSF 03.5
01ED: BSF 03.6
01EE: MOVF 09,W
01EF: ANDLW C0
01F0: MOVWF 09
01F1: BCF 03.6
01F2: BCF 1F.4
01F3: BCF 1F.5
01F4: MOVLW 00
01F5: BSF 03.6
01F6: MOVWF 08
01F7: BCF 03.5
01F8: CLRF 07
01F9: CLRF 08
01FA: CLRF 09
....................
.................... setup_adc_ports(NO_ANALOGS|VSS_VDD);
*
01FE: BSF 03.5
01FF: BSF 03.6
0200: MOVF 09,W
0201: ANDLW C0
0202: MOVWF 09
0203: BCF 03.6
0204: BCF 1F.4
0205: BCF 1F.5
0206: MOVLW 00
0207: BSF 03.6
0208: MOVWF 08
.................... setup_adc(ADC_CLOCK_DIV_2);
0209: BCF 03.5
020A: BCF 03.6
020B: BCF 1F.6
020C: BCF 1F.7
020D: BSF 03.5
020E: BCF 1F.7
020F: BCF 03.5
0210: BSF 1F.0
.................... setup_spi(SPI_SS_DISABLED);
0211: BCF 14.5
0212: BCF 20.5
0213: MOVF 20,W
0214: BSF 03.5
0215: MOVWF 07
0216: BCF 03.5
0217: BSF 20.4
0218: MOVF 20,W
0219: BSF 03.5
021A: MOVWF 07
021B: BCF 03.5
021C: BCF 20.3
021D: MOVF 20,W
021E: BSF 03.5
021F: MOVWF 07
0220: MOVLW 01
0221: BCF 03.5
0222: MOVWF 14
0223: MOVLW 00
0224: BSF 03.5
0225: MOVWF 14
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
0226: MOVF 01,W
0227: ANDLW C7
0228: IORLW 08
0229: MOVWF 01
.................... setup_timer_1(T1_DISABLED);
022A: BCF 03.5
022B: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
022C: MOVLW 00
022D: MOVWF 78
022E: MOVWF 12
022F: MOVLW 00
0230: BSF 03.5
0231: MOVWF 12
.................... setup_ccp1(CCP_OFF);
0232: BCF 03.5
0233: BSF 20.2
0234: MOVF 20,W
0235: BSF 03.5
0236: MOVWF 07
0237: BCF 03.5
0238: CLRF 17
0239: BSF 03.5
023A: CLRF 1B
023B: CLRF 1C
023C: MOVLW 01
023D: MOVWF 1D
.................... setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
023E: BCF 03.5
023F: BSF 03.6
0240: CLRF 07
0241: CLRF 08
0242: CLRF 09
....................
.................... printf("Simple Thermomether \r\n",);
0243: MOVLW 04
0244: MOVWF 0D
0245: MOVLW 00
0246: MOVWF 0F
0247: BCF 03.6
0248: GOTO 053
....................
.................... int STAV1;
.................... unsigned int data1;
....................
....................
.................... while(TRUE)
.................... {
....................
....................
....................
.................... //akcelerometr
.................... int1 ack;
.................... i2c_start(); // If the write command is acknowledged,
0249: BSF 03.5
024A: BSF 06.0
024B: NOP
024C: BSF 06.1
024D: NOP
024E: BCF 03.5
024F: BCF 06.0
0250: BSF 03.5
0251: BCF 06.0
0252: NOP
0253: BCF 03.5
0254: BCF 06.1
0255: BSF 03.5
0256: BCF 06.1
.................... ack = i2c_write(0xD1);// then the device is ready.
0257: MOVLW D1
0258: BCF 03.5
0259: MOVWF 24
025A: CALL 09B
025B: MOVF 78,W
025C: BCF 23.0
025D: BTFSC 78.0
025E: BSF 23.0
.................... i2c_stop();
025F: BSF 03.5
0260: BCF 06.0
0261: NOP
0262: BSF 06.1
0263: BCF 03.5
0264: BTFSS 06.1
0265: GOTO 264
0266: NOP
0267: GOTO 268
0268: NOP
0269: BSF 03.5
026A: BSF 06.0
026B: NOP
.................... ack=!ack;
026C: MOVLW 01
026D: BCF 03.5
026E: XORWF 23,F
....................
....................
....................
.................... i2c_stop();
026F: BSF 03.5
0270: BCF 06.0
0271: NOP
0272: BSF 06.1
0273: BCF 03.5
0274: BTFSS 06.1
0275: GOTO 274
0276: NOP
0277: GOTO 278
0278: NOP
0279: BSF 03.5
027A: BSF 06.0
027B: NOP
....................
.................... i2c_start();
027C: BSF 06.0
027D: NOP
027E: BSF 06.1
027F: NOP
0280: BCF 03.5
0281: BCF 06.0
0282: BSF 03.5
0283: BCF 06.0
0284: NOP
0285: BCF 03.5
0286: BCF 06.1
0287: BSF 03.5
0288: BCF 06.1
.................... I2C_Write(0xD0);
0289: MOVLW D0
028A: BCF 03.5
028B: MOVWF 24
028C: CALL 09B
.................... I2C_write(0x28);
028D: MOVLW 28
028E: MOVWF 24
028F: CALL 09B
.................... i2c_stop();
0290: BSF 03.5
0291: BCF 06.0
0292: NOP
0293: BSF 06.1
0294: BCF 03.5
0295: BTFSS 06.1
0296: GOTO 295
0297: NOP
0298: GOTO 299
0299: NOP
029A: BSF 03.5
029B: BSF 06.0
029C: NOP
.................... i2c_start();
029D: BSF 06.0
029E: NOP
029F: BSF 06.1
02A0: NOP
02A1: BCF 03.5
02A2: BCF 06.0
02A3: BSF 03.5
02A4: BCF 06.0
02A5: NOP
02A6: BCF 03.5
02A7: BCF 06.1
02A8: BSF 03.5
02A9: BCF 06.1
.................... I2C_Write(0xD1);
02AA: MOVLW D1
02AB: BCF 03.5
02AC: MOVWF 24
02AD: CALL 09B
.................... STAV1=i2c_read(0);
02AE: CLRF 77
02AF: CALL 0CF
02B0: MOVF 78,W
02B1: MOVWF 21
.................... i2c_stop();
02B2: BSF 03.5
02B3: BCF 06.0
02B4: NOP
02B5: BSF 06.1
02B6: BCF 03.5
02B7: BTFSS 06.1
02B8: GOTO 2B7
02B9: NOP
02BA: GOTO 2BB
02BB: NOP
02BC: BSF 03.5
02BD: BSF 06.0
02BE: NOP
....................
.................... i2c_start();
02BF: BSF 06.0
02C0: NOP
02C1: BSF 06.1
02C2: NOP
02C3: BCF 03.5
02C4: BCF 06.0
02C5: BSF 03.5
02C6: BCF 06.0
02C7: NOP
02C8: BCF 03.5
02C9: BCF 06.1
02CA: BSF 03.5
02CB: BCF 06.1
.................... I2C_Write(0xD0);
02CC: MOVLW D0
02CD: BCF 03.5
02CE: MOVWF 24
02CF: CALL 09B
.................... I2C_write(0x0F);
02D0: MOVLW 0F
02D1: MOVWF 24
02D2: CALL 09B
.................... i2c_stop();
02D3: BSF 03.5
02D4: BCF 06.0
02D5: NOP
02D6: BSF 06.1
02D7: BCF 03.5
02D8: BTFSS 06.1
02D9: GOTO 2D8
02DA: NOP
02DB: GOTO 2DC
02DC: NOP
02DD: BSF 03.5
02DE: BSF 06.0
02DF: NOP
.................... i2c_start();
02E0: BSF 06.0
02E1: NOP
02E2: BSF 06.1
02E3: NOP
02E4: BCF 03.5
02E5: BCF 06.0
02E6: BSF 03.5
02E7: BCF 06.0
02E8: NOP
02E9: BCF 03.5
02EA: BCF 06.1
02EB: BSF 03.5
02EC: BCF 06.1
.................... I2C_Write(0xD1);
02ED: MOVLW D1
02EE: BCF 03.5
02EF: MOVWF 24
02F0: CALL 09B
.................... data1=i2c_read(0);
02F1: CLRF 77
02F2: CALL 0CF
02F3: MOVF 78,W
02F4: MOVWF 22
.................... i2c_stop();
02F5: BSF 03.5
02F6: BCF 06.0
02F7: NOP
02F8: BSF 06.1
02F9: BCF 03.5
02FA: BTFSS 06.1
02FB: GOTO 2FA
02FC: NOP
02FD: GOTO 2FE
02FE: NOP
02FF: BSF 03.5
0300: BSF 06.0
0301: NOP
....................
....................
....................
....................
....................
.................... printf("Stav: %d (procenta)\r\n", ack);
0302: MOVLW 00
0303: BCF 03.5
0304: BTFSC 23.0
0305: MOVLW 01
0306: MOVWF 24
0307: MOVLW 10
0308: BSF 03.6
0309: MOVWF 0D
030A: MOVLW 00
030B: MOVWF 0F
030C: BCF 03.0
030D: MOVLW 06
030E: BCF 03.6
030F: MOVWF 25
0310: CALL 102
0311: MOVF 24,W
0312: MOVWF 25
0313: MOVLW 1F
0314: MOVWF 26
0315: CALL 166
0316: MOVLW 14
0317: BSF 03.6
0318: MOVWF 0D
0319: MOVLW 00
031A: MOVWF 0F
031B: BCF 03.0
031C: MOVLW 0D
031D: BCF 03.6
031E: MOVWF 25
031F: CALL 102
.................... printf("Stav: %d (procenta)\r\n", STAV1);
0320: MOVLW 1B
0321: BSF 03.6
0322: MOVWF 0D
0323: MOVLW 00
0324: MOVWF 0F
0325: BCF 03.0
0326: MOVLW 06
0327: BCF 03.6
0328: MOVWF 25
0329: CALL 102
032A: MOVF 21,W
032B: MOVWF 25
032C: MOVLW 1F
032D: MOVWF 26
032E: CALL 166
032F: MOVLW 1F
0330: BSF 03.6
0331: MOVWF 0D
0332: MOVLW 00
0333: MOVWF 0F
0334: BCF 03.0
0335: MOVLW 0D
0336: BCF 03.6
0337: MOVWF 25
0338: CALL 102
.................... printf("Stav: %du(procenta)\r\n", data1);
0339: MOVLW 26
033A: BSF 03.6
033B: MOVWF 0D
033C: MOVLW 00
033D: MOVWF 0F
033E: BCF 03.0
033F: MOVLW 06
0340: BCF 03.6
0341: MOVWF 25
0342: CALL 102
0343: MOVF 22,W
0344: MOVWF 25
0345: MOVLW 1F
0346: MOVWF 26
0347: CALL 166
0348: MOVLW 2A
0349: BSF 03.6
034A: MOVWF 0D
034B: MOVLW 00
034C: MOVWF 0F
034D: BCF 03.0
034E: MOVLW 0D
034F: BCF 03.6
0350: MOVWF 25
0351: CALL 102
.................... delay_ms (2000);
0352: MOVLW 08
0353: MOVWF 24
0354: MOVLW FA
0355: MOVWF 25
0356: GOTO 1CB
0357: DECFSZ 24,F
0358: GOTO 354
....................
.................... }
0359: GOTO 249
.................... }
035A: SLEEP
 
Configuration Fuses:
Word 1: 2CF5 INTRC NOWDT NOPUT MCLR NOPROTECT NOCPD NOBROWNOUT IESO FCMEN NOLVP NODEBUG
Word 2: 3FFF NOWRT BORV40
/Modules/Sensors/IMU01A/SW/PIC16F887/Gyroskop/main.pjt
0,0 → 1,24
[PROJECT]
Target=C:\Users\Honza\Documents\pic\I2C_gyrsokop\main.hex
Development_Mode=
Processor_Text=PIC16F887
ToolSuite=CCS
Processor=0x887F
[C:\Users\Honza\Documents\pic\I2C_gyrsokop\main]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
[mru-list]
1=C:\Users\Honza\Documents\pic\I2C_gyrsokop\main.c
[Windows]
0=0000 %S 0 0 796 451 3 0
[Units]
Link=0
Count=1
1=C:\Users\Honza\Documents\pic\I2C_gyrsokop\main
[Opened Files]
1=main.c
2=
/Modules/Sensors/IMU01A/SW/PIC16F887/Gyroskop/main.sta
0,0 → 1,58
 
ROM used: 859 (10%)
859 (10%) including unused fragments
 
2 Average locations per line
23 Average locations per statement
 
RAM used: 7 (2%) at main() level
19 (5%) worst case
 
Stack used: 2 worst case (out of 8 total available)
 
Lines Stmts % Files
----- ----- --- -----
71 37 100 main.c
20 0 0 ..\I2C_magnetometr\main.h
423 0 0 ..\..\..\..\..\Program Files (x86)\PICC\devices\16F887.h
----- -----
514 37 Total
 
Page ROM % RAM Vol Diff Functions:
---- --- --- --- --- ---- ----------
0 22 3 1 @delay_ms1
0 51 6 3 @I2C_READ_1
0 52 6 1 @I2C_WRITE_1
0 34 4 1 @PUTCHAR_1_
0 378 44 1 1045 3.9 main
0 12 1 0 @const78
0 72 8 3 @PSTRINGC7_68
0 11 1 0 @const83
0 79 9 4 @PSTRINGCN7_68
0 21 2 3 @DIV88
0 101 12 6 @PRINTF_D_68
0 11 1 0 @const92
0 11 1 0 @const93
 
Program metrics:
Functions 1
Statements 37
Comments 87
Volume (V) 1076
Difficilty (D) 3.4
Effort to implement (E) 3626
Time to implement (T) 3 minutes
Est Delivered Bugs (B) 0
Cyclomatic Complexity 1
Maintainability (MI) 124
 
Segment Used Free
----------- ---- ----
00000-00003 4 0
00004-007FF 855 1189
00800-00FFF 0 2048
01000-017FF 0 2048
01800-01FFF 0 2048
 
 
 
/Modules/Sensors/IMU01A/SW/PIC16F887/Gyroskop/main.sym
0,0 → 1,95
004 @WRITE_PROGRAM_MEMORY8.P1
004-005 @READ_PROGRAM_MEMORY8.P2
015 CCP_1_LOW
015 CCP_1
016 CCP_1_HIGH
01B CCP_2
01B CCP_2_LOW
01C CCP_2_HIGH
020 @TRIS_C
021 main.STAV1
022 main.data1
023.0 ack
024 @I2C_READ_1.P1
024 @I2C_WRITE_1.P2
024 main.@SCRATCH1
024 @PSTRINGC7_68.@SCRATCH1
025 @delay_ms1.P1
025 @PRINTF_D_68.P2
025 @PSTRINGCN7_68.P3
025 @I2C_READ_1.@SCRATCH1
025 @PSTRINGC7_68.@SCRATCH2
026 @PRINTF_D_68.P1
026 @I2C_READ_1.@SCRATCH2
026 @PSTRINGC7_68.@SCRATCH3
026 @PSTRINGCN7_68.@SCRATCH1
027 @PSTRINGCN7_68.@SCRATCH2
027 @PRINTF_D_68.@SCRATCH1
028 @PSTRINGCN7_68.@SCRATCH3
028 @PRINTF_D_68.@SCRATCH2
029 @PRINTF_D_68.@SCRATCH3
02A @PRINTF_D_68.@SCRATCH4
02B @PUTCHAR_1_.P1
02B @DIV88.P2
02C @DIV88.P1
02D @DIV88.@SCRATCH1
077 @SCRATCH
078 @SCRATCH
078 _RETURN_
079 @SCRATCH
07A @SCRATCH
107.6 C1OUT
108.6 C2OUT
10D-10E @READ_PROGRAM_MEMORY8.P1
10D-10E @WRITE_PROGRAM_MEMORY8.P2
 
ROM Allocation:
01CB @delay_ms1
00CF @I2C_READ_1
009B @I2C_WRITE_1
0031 @PUTCHAR_1_
01E1 main
0004 @const78
0053 @PSTRINGC7_68
0010 @const83
0102 @PSTRINGCN7_68
0151 @DIV88
0166 @PRINTF_D_68
001B @const92
0026 @const93
01E1 @cinit
 
 
User Memory space:
 
User Memory space:
 
Project Directory:
C:\Users\Honza\Documents\pic\I2C_gyrsokop\
 
Project Files:
main.c
..\I2C_magnetometr\main.h
..\..\..\..\..\Program Files (x86)\PICC\devices\16F887.h
 
Units:
C:\Users\Honza\Documents\pic\I2C_gyrsokop\main (main)
 
Compiler Settings:
Processor: PIC16F887
Pointer Size: 16
ADC Range: 0-255
Opt Level: 9
Short,Int,Long: UNSIGNED: 1,8,16
Float,Double: 32,32
 
Output Files:
Errors: main.err
Ext Symbols: main.esym
INHX8: main.hex
Symbols: main.sym
List: main.lst
Debug/COFF: main.cof
Project: main.PJT
Call Tree: main.tre
Statistics: main.sta
/Modules/Sensors/IMU01A/SW/PIC16F887/Gyroskop/main.tre
0,0 → 1,55
ÀÄmain
ÀÄmain 0/378 Ram=1
ÃÄ??0??
ÃÄ@PSTRINGC7_68 0/72 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/34 Ram=1
ÃÄ@I2C_WRITE_1 0/52 Ram=1
ÃÄ@I2C_WRITE_1 0/52 Ram=1
ÃÄ@I2C_WRITE_1 0/52 Ram=1
ÃÄ@I2C_WRITE_1 0/52 Ram=1
ÃÄ@I2C_READ_1 0/51 Ram=3
ÃÄ@I2C_WRITE_1 0/52 Ram=1
ÃÄ@I2C_WRITE_1 0/52 Ram=1
ÃÄ@I2C_WRITE_1 0/52 Ram=1
ÃÄ@I2C_READ_1 0/51 Ram=3
ÃÄ@PSTRINGCN7_68 0/79 Ram=4
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/34 Ram=1
ÃÄ@PRINTF_D_68 0/101 Ram=6
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/34 Ram=1
ÃÄ@PSTRINGCN7_68 0/79 Ram=4
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/34 Ram=1
ÃÄ@PSTRINGCN7_68 0/79 Ram=4
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/34 Ram=1
ÃÄ@PRINTF_D_68 0/101 Ram=6
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/34 Ram=1
ÃÄ@PSTRINGCN7_68 0/79 Ram=4
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/34 Ram=1
ÃÄ@PSTRINGCN7_68 0/79 Ram=4
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/34 Ram=1
ÃÄ@PRINTF_D_68 0/101 Ram=6
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@DIV88 0/21 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/34 Ram=1
ÃÄ@PSTRINGCN7_68 0/79 Ram=4
³ ÃÄ@PUTCHAR_1_ 0/34 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/34 Ram=1
ÀÄ@delay_ms1 0/22 Ram=1
/Modules/Sensors/IMU01A/SW/PIC16F887/MMA8451Q.h
0,0 → 1,14
//Adresa obvodu
#define AK_W 0x38 //adresa akcelerometru zápis
#define AK_R 0x39 //adresa akcelerometru ètení
 
 
#define AK_XH 0x01 //osa X MSB
#define AK_XL 0x02 //osa X LSB
#define AK_YH 0x03 //osa Y MSB
#define AK_YL 0x04 //osa Y LSB
#define AK_ZH 0x05 //osa Z MSB
#define AK_ZL 0x06 //osa Z LSB
 
 
#include "MMA8451Q.c"
/Modules/Sensors/IMU01A/SW/PIC16F887/MMA8451Q.c
0,0 → 1,59
void setAK (void) //nastaveni akcelerometru
{
i2c_start();
I2C_Write(AK_W);
I2C_write(0x2A);
I2C_write(0x01); //nastavi aktivni stav
i2c_stop();
}
 
 
int16 akR (int8 H, int8 L) //vycitani hodnot z akcelerometru
{
unsigned int8 XL=0,XH=0;
signed int16 x;
 
i2c_start();
I2C_Write(AK_W);
I2C_write(H);
i2c_start();
I2C_Write(AK_R);
XH=i2c_read(0);
i2c_stop();
 
i2c_start();
I2C_Write(AK_W);
I2C_write(L);
i2c_start();
I2C_Write(AK_R);
XL=i2c_read(0);
i2c_stop();
x = (((unsigned int16) XH << 8) + XL ); //prevod na 16bit hodnotu
x=x/4;
return x;
}
 
int16 akX (void)
{
int16 X;
X= akR (AK_XH, AK_XL);
return X;
}
 
int16 akY (void)
{
int16 Y;
Y= akR (AK_YH, AK_YL);
return Y;
}
 
int16 akZ (void)
{
int16 Z;
Z= akR (AK_ZH, AK_ZL);
return Z;
}
 
/Modules/Sensors/IMU01A/SW/PIC16F887/main.bak
0,0 → 1,56
//Akcelerometr IMU01A
//(c) MLAB Jan Chroust 2013
 
 
#include <main.h>
 
#define PIN_SDA PIN_C4
#define PIN_SCL PIN_C3
#use i2c(master, sda=PIN_SDA, scl=PIN_SCL) //I2C
#use rs232(baud=9600,parity=N,xmit=PIN_C7,rcv=PIN_C6,bits=8) //rcv TXD xmit RXD
#include <math.h>
#include <MMA8451Q.h>
 
 
//Akcelerometr
#define AK_W 0x38 //adresa akcelerometru zápis
#define AK_R 0x39 //adresa akcelerometru ètení
#define AK_XH 0x01 //osa X LSB
#define AK_XL 0x02 //osa X MSB
#define AK_YH 0x03 //osa Y LSB
#define AK_YL 0x04 //osa Y MSB
#define AK_ZH 0x05 //osa Z LSB
#define AK_ZL 0x06 //osa Z MSB
 
signed int16 X, Y, Z; //promenne pro akcelerometr
 
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
 
setAK(); //nastaveni akcelerometru
 
printf("Akcelerometr IMU01A - MMA8451Q \r\n",);
printf("(c) MLAB JACHO 2013 \r\n",);
while(TRUE)
{
X=akX ();
Y=akY ();
Z=akZ ();
printf("Namerene hodnoty: \r\n",);
printf("Osa X: %Ld \r\n",X);
printf("Osa Y: %Ld \r\n",Y);
printf("Osa Z: %Ld \r\n",Z);
delay_ms (2000);
}
}
 
/Modules/Sensors/IMU01A/SW/PIC16F887/main.c
0,0 → 1,45
//Akcelerometr IMU01A
//(c) MLAB Jan Chroust 2013
 
 
#include <main.h>
 
#define PIN_SDA PIN_C4
#define PIN_SCL PIN_C3
#use i2c(master, sda=PIN_SDA, scl=PIN_SCL) //I2C
#use rs232(baud=9600,parity=N,xmit=PIN_C7,rcv=PIN_C6,bits=8) //rcv TXD xmit RXD
#include <math.h>
#include <MMA8451Q.h>
 
signed int16 X, Y, Z; //promenne pro akcelerometr
 
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
 
setAK(); //nastaveni akcelerometru
 
printf("Akcelerometr IMU01A - MMA8451Q \r\n",);
printf("(c) MLAB JACHO 2013 \r\n",);
while(TRUE)
{
X=akX ();
Y=akY ();
Z=akZ ();
printf("Namerene hodnoty: \r\n",);
printf("Osa X: %Ld \r\n",X);
printf("Osa Y: %Ld \r\n",Y);
printf("Osa Z: %Ld \r\n",Z);
delay_ms (2000);
}
}
 
/Modules/Sensors/IMU01A/SW/PIC16F887/main.cof
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Modules/Sensors/IMU01A/SW/PIC16F887/main.err
0,0 → 1,2
Memory usage: ROM=14% RAM=4% - 7%
0 Errors, 0 Warnings.
/Modules/Sensors/IMU01A/SW/PIC16F887/main.esym
0,0 → 1,590
D G "__PCM__" 0 58 ""4.106""
D G "__DEVICE__" 0 58 "887"
D G "__DATE__" 0 58 ""11-5-13""
D G "__TIME__" 0 58 ""10:50:06"" "Akcelerometr IMU01A"
d G "PIN_A0" 2 20 "40"
d G "PIN_A1" 2 21 "41"
d G "PIN_A2" 2 22 "42"
d G "PIN_A3" 2 23 "43"
d G "PIN_A4" 2 24 "44"
d G "PIN_A5" 2 25 "45"
d G "PIN_A6" 2 26 "46"
d G "PIN_A7" 2 27 "47"
d G "PIN_B0" 2 29 "48"
d G "PIN_B1" 2 30 "49"
d G "PIN_B2" 2 31 "50"
d G "PIN_B3" 2 32 "51"
d G "PIN_B4" 2 33 "52"
d G "PIN_B5" 2 34 "53"
d G "PIN_B6" 2 35 "54"
d G "PIN_B7" 2 36 "55"
d G "PIN_C0" 2 38 "56"
d G "PIN_C1" 2 39 "57"
d G "PIN_C2" 2 40 "58"
d G "PIN_C3" 2 41 "59"
d G "PIN_C4" 2 42 "60"
d G "PIN_C5" 2 43 "61"
d G "PIN_C6" 2 44 "62"
d G "PIN_C7" 2 45 "63"
d G "PIN_D0" 2 47 "64"
d G "PIN_D1" 2 48 "65"
d G "PIN_D2" 2 49 "66"
d G "PIN_D3" 2 50 "67"
d G "PIN_D4" 2 51 "68"
d G "PIN_D5" 2 52 "69"
d G "PIN_D6" 2 53 "70"
d G "PIN_D7" 2 54 "71"
d G "PIN_E0" 2 56 "72"
d G "PIN_E1" 2 57 "73"
d G "PIN_E2" 2 58 "74"
d G "PIN_E3" 2 59 "75"
d G "FALSE" 2 62 "0"
d G "TRUE" 2 63 "1"
d G "BYTE" 2 65 "int8"
d G "BOOLEAN" 2 66 "int1"
d G "getc" 2 68 "getch"
d G "fgetc" 2 69 "getch"
d G "getchar" 2 70 "getch"
d G "putc" 2 71 "putchar"
d G "fputc" 2 72 "putchar"
d G "fgets" 2 73 "gets"
d G "fputs" 2 74 "puts"
d G "WDT_FROM_SLEEP" 2 79 "3"
d G "WDT_TIMEOUT" 2 80 "11"
d G "MCLR_FROM_SLEEP" 2 81 "19"
d G "MCLR_FROM_RUN" 2 82 "27"
d G "NORMAL_POWER_UP" 2 83 "25"
d G "BROWNOUT_RESTART" 2 84 "26"
d G "T0_INTERNAL" 2 91 "0"
d G "T0_EXT_L_TO_H" 2 92 "32"
d G "T0_EXT_H_TO_L" 2 93 "48"
d G "T0_DIV_1" 2 95 "8"
d G "T0_DIV_2" 2 96 "0"
d G "T0_DIV_4" 2 97 "1"
d G "T0_DIV_8" 2 98 "2"
d G "T0_DIV_16" 2 99 "3"
d G "T0_DIV_32" 2 100 "4"
d G "T0_DIV_64" 2 101 "5"
d G "T0_DIV_128" 2 102 "6"
d G "T0_DIV_256" 2 103 "7"
d G "T0_8_BIT" 2 106 "0"
d G "RTCC_INTERNAL" 2 108 "0" "The following are provided for compatibility"
d G "RTCC_EXT_L_TO_H" 2 109 "32" "with older compiler versions"
d G "RTCC_EXT_H_TO_L" 2 110 "48"
d G "RTCC_DIV_1" 2 111 "8"
d G "RTCC_DIV_2" 2 112 "0"
d G "RTCC_DIV_4" 2 113 "1"
d G "RTCC_DIV_8" 2 114 "2"
d G "RTCC_DIV_16" 2 115 "3"
d G "RTCC_DIV_32" 2 116 "4"
d G "RTCC_DIV_64" 2 117 "5"
d G "RTCC_DIV_128" 2 118 "6"
d G "RTCC_DIV_256" 2 119 "7"
d G "RTCC_8_BIT" 2 120 "0"
d G "WDT_18MS" 2 132 "8"
d G "WDT_36MS" 2 133 "9"
d G "WDT_72MS" 2 134 "10"
d G "WDT_144MS" 2 135 "11"
d G "WDT_288MS" 2 136 "12"
d G "WDT_576MS" 2 137 "13"
d G "WDT_1152MS" 2 138 "14"
d G "WDT_2304MS" 2 139 "15"
d G "WDT_ON" 2 143 "0x4100"
d G "WDT_OFF" 2 144 "0"
d G "WDT_DIV_16" 2 145 "0x100"
d G "WDT_DIV_8" 2 146 "0x300"
d G "WDT_DIV_4" 2 147 "0x500"
d G "WDT_DIV_2" 2 148 "0x700"
d G "WDT_TIMES_1" 2 149 "0x900" "Default"
d G "WDT_TIMES_2" 2 150 "0xB00"
d G "WDT_TIMES_4" 2 151 "0xD00"
d G "WDT_TIMES_8" 2 152 "0xF00"
d G "WDT_TIMES_16" 2 153 "0x1100"
d G "WDT_TIMES_32" 2 154 "0x1300"
d G "WDT_TIMES_64" 2 155 "0x1500"
d G "WDT_TIMES_128" 2 156 "0x1700"
d G "T1_DISABLED" 2 162 "0"
d G "T1_INTERNAL" 2 163 "5"
d G "T1_EXTERNAL" 2 164 "7"
d G "T1_EXTERNAL_SYNC" 2 165 "3"
d G "T1_CLK_OUT" 2 167 "8"
d G "T1_DIV_BY_1" 2 169 "0"
d G "T1_DIV_BY_2" 2 170 "0x10"
d G "T1_DIV_BY_4" 2 171 "0x20"
d G "T1_DIV_BY_8" 2 172 "0x30"
d G "T1_GATE" 2 174 "0x40"
d G "T1_GATE_INVERTED" 2 175 "0xC0"
d G "T2_DISABLED" 2 180 "0"
d G "T2_DIV_BY_1" 2 181 "4"
d G "T2_DIV_BY_4" 2 182 "5"
d G "T2_DIV_BY_16" 2 183 "6"
d G "CCP_OFF" 2 189 "0"
d G "CCP_CAPTURE_FE" 2 190 "4"
d G "CCP_CAPTURE_RE" 2 191 "5"
d G "CCP_CAPTURE_DIV_4" 2 192 "6"
d G "CCP_CAPTURE_DIV_16" 2 193 "7"
d G "CCP_COMPARE_SET_ON_MATCH" 2 194 "8"
d G "CCP_COMPARE_CLR_ON_MATCH" 2 195 "9"
d G "CCP_COMPARE_INT" 2 196 "0xA"
d G "CCP_COMPARE_RESET_TIMER" 2 197 "0xB"
d G "CCP_PWM" 2 198 "0xC"
d G "CCP_PWM_PLUS_1" 2 199 "0x1c"
d G "CCP_PWM_PLUS_2" 2 200 "0x2c"
d G "CCP_PWM_PLUS_3" 2 201 "0x3c"
d G "CCP_PWM_H_H" 2 206 "0x0c"
d G "CCP_PWM_H_L" 2 207 "0x0d"
d G "CCP_PWM_L_H" 2 208 "0x0e"
d G "CCP_PWM_L_L" 2 209 "0x0f"
d G "CCP_PWM_FULL_BRIDGE" 2 211 "0x40"
d G "CCP_PWM_FULL_BRIDGE_REV" 2 212 "0xC0"
d G "CCP_PWM_HALF_BRIDGE" 2 213 "0x80"
d G "CCP_SHUTDOWN_ON_COMP1" 2 215 "0x100000"
d G "CCP_SHUTDOWN_ON_COMP2" 2 216 "0x200000"
d G "CCP_SHUTDOWN_ON_COMP" 2 217 "0x300000"
d G "CCP_SHUTDOWN_ON_INT0" 2 218 "0x400000"
d G "CCP_SHUTDOWN_ON_COMP1_INT0" 2 219 "0x500000"
d G "CCP_SHUTDOWN_ON_COMP2_INT0" 2 220 "0x600000"
d G "CCP_SHUTDOWN_ON_COMP_INT0" 2 221 "0x700000"
d G "CCP_SHUTDOWN_AC_L" 2 223 "0x000000"
d G "CCP_SHUTDOWN_AC_H" 2 224 "0x040000"
d G "CCP_SHUTDOWN_AC_F" 2 225 "0x080000"
d G "CCP_SHUTDOWN_BD_L" 2 227 "0x000000"
d G "CCP_SHUTDOWN_BD_H" 2 228 "0x010000"
d G "CCP_SHUTDOWN_BD_F" 2 229 "0x020000"
d G "CCP_SHUTDOWN_RESTART" 2 231 "0x80000000"
d G "CCP_PULSE_STEERING_A" 2 233 "0x01000000"
d G "CCP_PULSE_STEERING_B" 2 234 "0x02000000"
d G "CCP_PULSE_STEERING_C" 2 235 "0x04000000"
d G "CCP_PULSE_STEERING_D" 2 236 "0x08000000"
d G "CCP_PULSE_STEERING_SYNC" 2 237 "0x10000000"
d G "SPI_MASTER" 2 245 "0x20"
d G "SPI_SLAVE" 2 246 "0x24"
d G "SPI_L_TO_H" 2 247 "0"
d G "SPI_H_TO_L" 2 248 "0x10"
d G "SPI_CLK_DIV_4" 2 249 "0"
d G "SPI_CLK_DIV_16" 2 250 "1"
d G "SPI_CLK_DIV_64" 2 251 "2"
d G "SPI_CLK_T2" 2 252 "3"
d G "SPI_SS_DISABLED" 2 253 "1"
d G "SPI_SAMPLE_AT_END" 2 255 "0x8000"
d G "SPI_XMIT_L_TO_H" 2 256 "0x4000"
d G "UART_ADDRESS" 2 262 "2"
d G "UART_DATA" 2 263 "4"
d G "UART_AUTODETECT" 2 264 "8"
d G "UART_AUTODETECT_NOWAIT" 2 265 "9"
d G "UART_WAKEUP_ON_RDA" 2 266 "10"
d G "UART_SEND_BREAK" 2 267 "13"
d G "NC_NC_NC_NC" 2 273 "0x00"
d G "NC_NC" 2 274 "0x00"
d G "CP1_A0_A3" 2 277 "0x00090080"
d G "CP1_A1_A3" 2 278 "0x000A0081"
d G "CP1_B3_A3" 2 279 "0x00880082"
d G "CP1_B1_A3" 2 280 "0x00280083"
d G "CP1_A0_VREF" 2 281 "0x00010084"
d G "CP1_A1_VREF" 2 282 "0x00020085"
d G "CP1_B3_VREF" 2 283 "0x00800086"
d G "CP1_B1_VREF" 2 284 "0x00200087"
d G "CP1_OUT_ON_A4" 2 286 "0x00000020"
d G "CP1_INVERT" 2 287 "0x00000010"
d G "CP1_ABSOLUTE_VREF" 2 288 "0x20000000"
d G "CP2_A0_A2" 2 291 "0x00058000"
d G "CP2_A1_A2" 2 292 "0x00068100"
d G "CP2_B3_A2" 2 293 "0x00848200"
d G "CP2_B1_A2" 2 294 "0x00248300"
d G "CP2_A0_VREF" 2 295 "0x00018400"
d G "CP2_A1_VREF" 2 296 "0x00028500"
d G "CP2_B3_VREF" 2 297 "0x00808600"
d G "CP2_B1_VREF" 2 298 "0x00208700"
d G "CP2_OUT_ON_A5" 2 300 "0x00002000"
d G "CP2_INVERT" 2 301 "0x00001000"
d G "CP2_ABSOLUTE_VREF" 2 302 "0x10000000"
d G "CP2_T1_SYNC" 2 305 "0x01000000"
d G "CP2_T1_GATE" 2 306 "0x02000000"
d G "VREF_LOW" 2 315 "0xa0"
d G "VREF_HIGH" 2 316 "0x80"
d G "OSC_31KHZ" 2 322 "1"
d G "OSC_125KHZ" 2 323 "0x11"
d G "OSC_250KHZ" 2 324 "0x21"
d G "OSC_500KHZ" 2 325 "0x31"
d G "OSC_1MHZ" 2 326 "0x41"
d G "OSC_2MHZ" 2 327 "0x51"
d G "OSC_4MHZ" 2 328 "0x61"
d G "OSC_8MHZ" 2 329 "0x71"
d G "OSC_INTRC" 2 330 "1"
d G "OSC_NORMAL" 2 331 "0"
d G "OSC_STATE_STABLE" 2 333 "4"
d G "OSC_31KHZ_STABLE" 2 334 "2"
d G "ADC_OFF" 2 342 "0" "ADC Off"
d G "ADC_CLOCK_DIV_2" 2 343 "0x100"
d G "ADC_CLOCK_DIV_8" 2 344 "0x40"
d G "ADC_CLOCK_DIV_32" 2 345 "0x80"
d G "ADC_CLOCK_INTERNAL" 2 346 "0xc0" "Internal 2-6us"
d G "sAN0" 2 350 "1" "| A0"
d G "sAN1" 2 351 "2" "| A1"
d G "sAN2" 2 352 "4" "| A2"
d G "sAN3" 2 353 "8" "| A3"
d G "sAN4" 2 354 "16" "| A5"
d G "sAN5" 2 355 "32" "| E0"
d G "sAN6" 2 356 "64" "| E1"
d G "sAN7" 2 357 "128" "| E2"
d G "sAN8" 2 358 "0x10000" "| B2"
d G "sAN9" 2 359 "0x20000" "| B3"
d G "sAN10" 2 360 "0x40000" "| B1"
d G "sAN11" 2 361 "0x80000" "| B4"
d G "sAN12" 2 362 "0x100000" "| B0"
d G "sAN13" 2 363 "0x200000" "| B5"
d G "NO_ANALOGS" 2 364 "0" "None"
d G "ALL_ANALOG" 2 365 "0x1F00FF" "A0 A1 A2 A3 A5 E0 E1 E2 B0 B1 B2 B3 B4 B5"
d G "VSS_VDD" 2 368 "0x0000" "| Range 0-Vdd"
d G "VSS_VREF" 2 369 "0x1000" "| Range 0-Vref"
d G "VREF_VREF" 2 370 "0x3000" "| Range Vref-Vref"
d G "VREF_VDD" 2 371 "0x2000" "| Range Vref-Vdd"
d G "ADC_START_AND_READ" 2 375 "7" "This is the default if nothing is specified"
d G "ADC_START_ONLY" 2 376 "1"
d G "ADC_READ_ONLY" 2 377 "6"
d G "L_TO_H" 2 389 "0x40"
d G "H_TO_L" 2 390 "0"
d G "GLOBAL" 2 392 "0x0BC0"
d G "INT_RTCC" 2 393 "0x000B20"
d G "INT_RB" 2 394 "0x01FF0B08"
d G "INT_EXT_L2H" 2 395 "0x50000B10"
d G "INT_EXT_H2L" 2 396 "0x60000B10"
d G "INT_EXT" 2 397 "0x000B10"
d G "INT_AD" 2 398 "0x008C40"
d G "INT_TBE" 2 399 "0x008C10"
d G "INT_RDA" 2 400 "0x008C20"
d G "INT_TIMER1" 2 401 "0x008C01"
d G "INT_TIMER2" 2 402 "0x008C02"
d G "INT_CCP1" 2 403 "0x008C04"
d G "INT_CCP2" 2 404 "0x008D01"
d G "INT_SSP" 2 405 "0x008C08"
d G "INT_BUSCOL" 2 406 "0x008D08"
d G "INT_EEPROM" 2 407 "0x008D10"
d G "INT_TIMER0" 2 408 "0x000B20"
d G "INT_OSC_FAIL" 2 409 "0x008D80"
d G "INT_COMP" 2 410 "0x008D20"
d G "INT_COMP2" 2 411 "0x008D40"
d G "INT_ULPWU" 2 412 "0x008D04"
d G "INT_RB0" 2 413 "0x0010B08"
d G "INT_RB1" 2 414 "0x0020B08"
d G "INT_RB2" 2 415 "0x0040B08"
d G "INT_RB3" 2 416 "0x0080B08"
d G "INT_RB4" 2 417 "0x0100B08"
d G "INT_RB5" 2 418 "0x0200B08"
d G "INT_RB6" 2 419 "0x0400B08"
d G "INT_RB7" 2 420 "0x0800B08"
D G "PIN_SDA" 0 7 "PIN_C4"
D G "PIN_SCL" 0 8 "PIN_C3"
D G "MATH_H" 3 21 ""
D G "PI" 3 26 "3.1415926535897932"
D G "SQRT2" 3 29 "1.4142135623730950"
C L "CEIL_FLOOR" 3 2 3 "FUNCTION"
F G "CEIL_FLOOR" 3 36 "float(float x,int8 n)"
V L "x" 3 36 "float"
V L "n" 3 36 "int8"
V L "y" 3 38 "float"
V L "res" 3 38 "float"
V L "l" 3 39 "int16"
V L "s" 3 40 "int1"
C L "floor" 3 2 5 "FUNCTION"
F G "floor" 3 192 "float(float x)"
V L "x" 3 192 "float"
C L "ceil" 3 2 5 "FUNCTION"
F G "ceil" 3 218 "float(float x)"
V L "x" 3 218 "float"
D G "fabs" 3 244 "abs"
C L "fmod" 3 2 6 "FUNCTION"
F G "fmod" 3 256 "float(float x,float y)"
V L "x" 3 256 "float"
V L "y" 3 256 "float"
V L "i" 3 258 "float"
D G "LN2" 3 319 "0.6931471805599453"
V G "pe" 3 321 "float[6]"
F G "exp" 3 325 "float(float x)"
V L "x" 3 325 "float"
V L "y" 3 327 "float"
V L "res" 3 327 "float"
V L "r" 3 327 "float"
V L "n" 3 331 "sint8"
V L "s" 3 332 "int1"
C L "exp" 3 2 1 "FUNCTION"
V G "pl" 3 496 "float[4]"
V G "ql" 3 497 "float[4]"
C L "log" 3 2 3 "FUNCTION"
F G "log" 3 505 "float(float x)"
V L "x" 3 505 "float"
V L "y" 3 507 "float"
V L "res" 3 507 "float"
V L "r" 3 507 "float"
V L "y2" 3 507 "float"
V L "n" 3 511 "sint8"
C L "log" 3 2 1 "FUNCTION"
D G "LN10" 3 729 "2.3025850929940456"
C L "log10" 3 2 3 "FUNCTION"
F G "log10" 3 737 "float(float x)"
V L "x" 3 737 "float"
V L "r" 3 739 "float"
C L "modf" 3 2 8 "FUNCTION"
F G "modf" 3 778 "float(float value,*float iptr)"
V L "value" 3 778 "float"
V L "iptr" 3 778 "*float"
C L "pwr" 3 2 6 "FUNCTION"
F G "pwr" 3 806 "float(float x,float y)"
V L "x" 3 806 "float"
V L "y" 3 806 "float"
C L "pow" 3 2 7 "FUNCTION"
F G "pow" 3 869 "float(float x,float y)"
V L "x" 3 869 "float"
V L "y" 3 869 "float"
C L "sqrt" 3 2 5 "FUNCTION"
F G "sqrt" 3 930 "float(float x)"
V L "x" 3 930 "float"
V L "y" 3 932 "float"
V L "res" 3 932 "float"
V L "p" 3 936 "*int8"
D G "PI_DIV_BY_TWO" 3 1125 "1.5707963267948966"
C L "cos" 3 2 3 "FUNCTION"
F G "cos" 3 1136 "float(float x)"
V L "x" 3 1136 "float"
V L "y" 3 1138 "float"
V L "t" 3 1138 "float"
V L "t2" 3 1138 "float"
V L "quad" 3 1139 "int8"
V L "i" 3 1139 "int8"
V L "frac" 3 1140 "float"
V L "p" 3 1141 "float[6]" "by the series definition for cosine"
C L "cos" 3 2 1 "FUNCTION"
C L "cos" 3 2 2 "FUNCTION"
C L "cos" 3 2 1 "FUNCTION"
C L "cos" 3 2 1 "FUNCTION"
C L "cos" 3 2 1 "FUNCTION"
C L "cos" 3 2 1 "FUNCTION"
C L "cos" 3 2 1 "FUNCTION"
C L "cos" 3 2 1 "FUNCTION"
C L "sin" 3 2 5 "FUNCTION"
F G "sin" 3 1278 "float(float x)"
V L "x" 3 1278 "float"
C L "tan" 3 2 5 "FUNCTION"
F G "tan" 3 1304 "float(float x)"
V L "x" 3 1304 "float"
V L "c" 3 1306 "float"
V L "s" 3 1306 "float"
V G "pas" 3 1344 "float[3]"
V G "qas" 3 1345 "float[3]"
F G "ASIN_COS" 3 1347 "float(float x,int8 n)"
V L "x" 3 1347 "float"
V L "n" 3 1347 "int8"
V L "y" 3 1349 "float"
V L "res" 3 1349 "float"
V L "r" 3 1349 "float"
V L "y2" 3 1349 "float"
V L "s" 3 1350 "int1"
C L "ASIN_COS" 3 2 1 "FUNCTION"
C L "ASIN_COS" 3 2 1 "FUNCTION"
C L "asin" 3 2 5 "FUNCTION"
F G "asin" 3 1493 "float(float x)"
V L "x" 3 1493 "float"
V L "r" 3 1495 "float"
C L "acos" 3 2 5 "FUNCTION"
F G "acos" 3 1527 "float(float x)"
V L "x" 3 1527 "float"
V L "r" 3 1529 "float"
V G "pat" 3 1555 "float[4]"
V G "qat" 3 1556 "float[4]"
C L "atan" 3 2 3 "FUNCTION"
F G "atan" 3 1564 "float(float x)"
V L "x" 3 1564 "float"
V L "y" 3 1566 "float"
V L "res" 3 1566 "float"
V L "r" 3 1566 "float"
V L "s" 3 1567 "int1"
V L "flag" 3 1567 "int1"
C L "atan" 3 2 1 "FUNCTION"
C L "atan2" 3 2 7 "FUNCTION"
F G "atan2" 3 1697 "float(float y,float x)"
V L "y" 3 1697 "float"
V L "x" 3 1697 "float"
V L "z" 3 1699 "float"
V L "sign" 3 1700 "int1"
V L "quad" 3 1701 "int8"
C L "atan2" 3 2 1 "FUNCTION"
C L "atan2" 3 2 1 "FUNCTION"
C L "cosh" 3 2 7 "FUNCTION"
F G "cosh" 3 1919 "float(float x)"
V L "x" 3 1919 "float"
C L "sinh" 3 2 6 "FUNCTION"
F G "sinh" 3 1946 "float(float x)"
V L "x" 3 1946 "float"
C L "tanh" 3 2 6 "FUNCTION"
F G "tanh" 3 1976 "float(float x)"
V L "x" 3 1976 "float"
D G "LOG2" 3 2006 ".30102999566398119521"
F G "frexp" 3 2007 "float(float x,*sint8 exp)"
V L "x" 3 2007 "float"
V L "exp" 3 2007 "*sint8"
V L "res" 3 2009 "float"
V L "sign" 3 2010 "int1"
C L "ldexp" 3 2 6 "FUNCTION"
F G "ldexp" 3 2152 "float(float value,sint8 exp)"
V L "value" 3 2152 "float"
V L "exp" 3 2152 "sint8"
D G "AK_W" 4 2 "0x38" "adresa akcelerometru zápis"
D G "AK_R" 4 3 "0x39" "adresa akcelerometru ètení"
D G "AK_XH" 4 6 "0x01" "osa X LSB"
D G "AK_XL" 4 7 "0x02" "osa X MSB"
D G "AK_YH" 4 8 "0x03" "osa Y LSB"
D G "AK_YL" 4 9 "0x04" "osa Y MSB"
D G "AK_ZH" 4 10 "0x05" "osa Z LSB"
D G "AK_ZL" 4 11 "0x06" "osa Z MSB"
F G "setAK" 5 1 "void()" "nastaveni akcelerometru"
C L "setAK" 5 6 1 "FUNCTION"
F G "akR" 5 12 "int16(int8 H,int8 l)"
V L "H" 5 12 "int8"
V L "l" 5 12 "int8" "vycitani hodnot z akcelerometru"
V L "XL" 5 14 "int8"
V L "XH" 5 14 "int8"
V L "x" 5 15 "sint16"
C L "akR" 5 6 1 "FUNCTION"
F G "akX" 5 39 "int16()"
V L "x" 5 41 "int16"
F G "akY" 5 46 "int16()"
V L "y" 5 48 "int16"
F G "akZ" 5 53 "int16()"
V L "z" 5 55 "int16"
V G "x" 0 14 "sint16"
V G "y" 0 14 "sint16"
V G "z" 0 14 "sint16" "promenne pro akcelerometr"
F G "MAIN" 0 16 "void()"
C L "MAIN" 0 27 1 "FUNCTION"
F B "reset_cpu" 0 0
F B "abs" 1 0
F B "sleep_ulpwu" 1 0
F B "sleep" 0 0
F B "delay_cycles" 1 0
F B "read_bank" 2 0
F B "write_bank" 3 0
F B "shift_left" 2 2
F B "shift_right" 2 2
F B "rotate_left" 2 0
F B "rotate_right" 2 0
F B "_mul" 2 0
F B "memset" 3 0
F B "isamoung" 2 0
F B "isamong" 2 0
F B "bit_set" 2 0
F B "bit_clear" 2 0
F B "bit_test" 2 0
F B "toupper" 1 0
F B "tolower" 1 0
F B "swap" 1 0
F B "printf" 1 255
F B "fprintf" 1 255
F B "sprintf" 1 255
F B "make8" 2 0
F B "make16" 2 0
F B "make32" 1 255
F B "label_address" 1 1
F B "goto_address" 1 0
F B "_va_arg" 1 0
F B "offsetofbit" 2 2
F B "enable_interrupts" 1 0
F B "disable_interrupts" 1 0
F B "interrupt_active" 1 0
F B "clear_interrupt" 1 0
F B "jump_to_isr" 1 0
F B "ext_int_edge" 1 2
F B "read_eeprom" 1 0
F B "write_eeprom" 2 0
F B "read_program_eeprom" 1 0
F B "write_program_eeprom" 2 0
F B "write_program_memory" 4 0
F B "write_program_memory8" 4 0
F B "read_program_memory" 4 0
F B "read_program_memory8" 4 0
F B "erase_program_eeprom" 1 0
F B "strcpy" 2 0
F B "memcpy" 3 0
F B "strstr100" 2 0
F B "output_high" 1 0
F B "output_low" 1 0
F B "input" 1 0
F B "input_state" 1 0
F B "output_float" 1 0
F B "output_drive" 1 0
F B "output_bit" 1 1
F B "output_toggle" 1 0
F B "output_a" 1 0
F B "output_b" 1 0
F B "output_c" 1 0
F B "output_d" 1 0
F B "output_e" 1 0
F B "input_a" 0 0
F B "input_b" 0 0
F B "input_c" 0 0
F B "input_d" 0 0
F B "input_e" 0 0
F B "set_tris_a" 1 0
F B "set_tris_b" 1 0
F B "set_tris_c" 1 0
F B "set_tris_d" 1 0
F B "set_tris_e" 1 0
F B "get_tris_a" 0 0
F B "get_tris_b" 0 0
F B "get_tris_c" 0 0
F B "get_tris_d" 0 0
F B "get_tris_e" 0 0
F B "input_change_a" 0 0
F B "input_change_b" 0 0
F B "input_change_c" 0 0
F B "input_change_d" 0 0
F B "input_change_e" 0 0
F B "port_b_pullups" 1 0
F B "setup_counters" 2 0
F B "setup_wdt" 1 0
F B "restart_cause" 0 0
F B "restart_wdt" 0 0
F B "get_rtcc" 0 0
F B "set_rtcc" 1 0
F B "get_timer0" 0 0
F B "set_timer0" 1 0
F B "setup_comparator" 1 0
F B "setup_port_a" 1 0
F B "setup_adc_ports" 1 0
F B "setup_adc" 1 0
F B "set_adc_channel" 1 0
F B "read_adc" 0 1
F B "adc_done" 0 0
F B "setup_timer_0" 1 0
F B "setup_vref" 1 0
F B "setup_timer_1" 1 0
F B "get_timer1" 0 0
F B "set_timer1" 1 0
F B "setup_timer_2" 3 0
F B "get_timer2" 0 0
F B "set_timer2" 1 0
F B "setup_ccp1" 1 2
F B "set_pwm1_duty" 1 0
F B "setup_ccp2" 1 0
F B "set_pwm2_duty" 1 0
F B "setup_oscillator" 1 2
F B "setup_spi" 1 0
F B "spi_read" 0 1
F B "spi_write" 1 0
F B "spi_data_is_in" 0 0
F B "setup_spi2" 1 0
F B "spi_read2" 0 1
F B "spi_write2" 1 0
F B "spi_data_is_in2" 0 0
F B "brownout_enable" 1 0
F B "delay_ms" 1 0
F B "delay_us" 1 0
F B "i2c_read" 0 2
F B "i2c_write" 1 2
F B "i2c_start" 0 2
F B "i2c_stop" 0 1
F B "i2c_isr_state" 0 1
F B "putchar" 1 2
F B "puts" 1 2
F B "getch" 0 1
F B "gets" 1 3
F B "kbhit" 0 1
/Modules/Sensors/IMU01A/SW/PIC16F887/main.h
0,0 → 1,19
#include <16F887.h>
#device adc=8
 
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES BORV40 //Brownout reset at 4.0V
 
#use delay(clock=8000000)
 
/Modules/Sensors/IMU01A/SW/PIC16F887/main.hex
0,0 → 1,148
:1000000003308A00972B0000C135E332EC32F2371F
:10001000ED327439A024CD2AB01841102D10CD2610
:10002000411CB41AB128A0060A00A83129104D2697
:1000300041212025C121C8272019B0183310A0065E
:100040000A00CE30ED32F232EE3220346F32EE372B
:10005000F43C3A100D050001CF396110581DA01273
:100060004C32A0060A00CF396110591DA0124C3243
:10007000A0060A00CF3961105A1DA0124C32A0060A
:100080000A000830F80000008711A011200883162C
:10009000870000008312AF0D0712031C552820169D
:1000A00020088316870059288312201220088316FF
:1000B000870000008312A015200883168700831292
:1000C000871D6028F80B432800008711A011200825
:1000D00083168700000083122016200883168700ED
:1000E000000000008312A0152008831687008312E9
:1000F000871D7828F8010000071A78148711A011CD
:100100002008831687008312071220122008831606
:10011000870083120800201620088316870000003D
:100120008312A0152008831687000000831207128F
:100130002012200883168700000083128711A01167
:1001400020088316870038308312AF0041202A3000
:10015000AF0041200130AF0041202012200883165B
:10016000870000008312A0152008831687008312E1
:10017000871DB8280000BC28000020162008831620
:100180008700000083128A110A12FF2BA013200897
:1001900083168700831287130830F800CF280000E9
:1001A000F817E028F813B00C03188717031C8713FF
:1001B0007817E0287813F80BD328DE28000087177B
:1001C0003F308400840BE2280000F81BD228781B03
:1001D000DA280800831603178C170C14000000009F
:1001E00083120C087F3903192E290313A700031764
:1001F0000D080313A80003170F080313A90027080D
:10020000B000C620280803178D0003132908031720
:100210008F0083168C170C140000000083120C0D45
:100220000E0D7F3903192E290313A70003170D089C
:100230000313A80003170F080313A9002708B00031
:10024000C620280803178D000313290803178F0001
:100250008D0A03198F0A0313EA28031703130800F2
:100260000830B0007708B1002016200883168700F8
:1002700000008312A0152008831687008312871DB3
:100280003F29071A0314071E0310F80D0000A011E0
:1002900020088316870083128711B00B342920169B
:1002A0002008831687000000831207123108031903
:1002B0005E29201220088316870083120000A015F3
:1002C0002008831687008312871D64290000871188
:1002D000A011200883168700000083120712201245
:1002E00020088316870083120800AB01AC0120169A
:1002F00020088316870000008312A01520088316AB
:10030000870000008312071220122008831687003E
:10031000000083128711A01120088316870038304F
:100320008312AF0041202908AF0041202016200889
:100330008316870000008312A0152008831687000B
:1003400000008312871DA22907122012200883169D
:100350008700000083128711A011200883168700F0
:1003600039308312AF004120F70130217808AC000A
:10037000201220088316870000008312A015200891
:10038000831687008312871DC3290000C729000038
:1003900020162008831687000000831220162008EC
:1003A0008316870000008312A0152008831687009B
:1003B0000000831207122012200883168700000015
:1003C00083128711A011200883168700383083120A
:1003D000AF0041202A08AF004120201620088316D4
:1003E000870000008312A0152008831687000000F4
:1003F0008312871DF929071220122008831687000F
:10040000000083128711A01120088316870039305D
:100410008312AF004120F70130217808AB00201291
:1004200020088316870000008312A0152008831679
:1004300087008312871D1A2A00001E2A000020163A
:1004400020088316870000008312B0012C08AF003B
:10045000B000AF012B082F07F8003008FA0003188E
:10046000FA0A7808AD007A08AE002E08B0002D0810
:10047000AF00B2010430B100300832068039B40058
:10048000B01F472AAF09B009AF0A0319B00AB21F5B
:100490004E2AB109B209B10A0319B20AF801F901E9
:1004A000F701FA013208031D582A31080319722A8C
:1004B0001030B3000310AF0DB00DF70DFA0D320878
:1004C0007A02031D652A31087702031C6E2A31085F
:1004D000F702031CFA033208FA020314F80DF90DAF
:1004E000B30B5A2AB41F792AF809F909F80A031933
:1004F000F90A7908AE007808AD002D08F8002E083A
:10050000F90008000130A9000230AA00752179081D
:10051000A8007808A7002708F8002808F9008A1121
:100520000A120E2C0330A9000430AA0075217908A4
:10053000A8007808A7002708F8002808F9008A1101
:100540000A12132C0530A9000630AA00752179087B
:10055000A8007808A7002708F8002808F9008A11E1
:100560000A12182C831603178C170C1400000000B5
:100570000318E12A83120C087F390313A80003171C
:100580000D080313A90003170F080313AA00280876
:10059000B000C620290803178D0003132A0803178B
:1005A0008F0083168C170C140000000083120313B5
:1005B000A70BDB2ADE2A83160317E12A002B8316FA
:1005C000031783120C0D0E0D7F390313A8000317B8
:1005D0000D080313A90003170F080313AA00280826
:1005E000B000C620290803178D0003132A0803173B
:1005F0008F008D0A03198F0A03100313A70BB22A69
:100600000800AF010408AE002F10831B2F14A81F91
:10061000112BAE172E1EAE0AA709A809A70A0319A7
:10062000A80A280EF038AA00AA07E23EAB00323E24
:10063000AD0028080F39AB07AB07AD07E93EAC00AA
:10064000AC07AC07270E0F39AC07AD07AC0DAD0DED
:10065000AD09AD0D27080F39AD07AA0D0730A90068
:100660000A30AD07AC03031C312BAC07AB03031CF2
:10067000352BAB07AA03031C392BAA07A903031CBC
:100680003D2B29308400831307302E052E1384035D
:100690002E05031D522B2E1A840A2E1A522B20309F
:1006A000F7006F2B84072D30040203192E17000862
:1006B000F700031D632B2E1B632B2E1A7D2BAE1907
:1006C000632B20306E2BAE1F6B2B2D30F700840375
:1006D0002E13AE136F2BAE152E123030F707A80174
:1006E0000408A7002810831B28147708B000C62030
:1006F00027088400831328188317840A2E1F532B7E
:10070000080028308400831300080319942B02305A
:10071000F800F701F70B8A2BF80B892B9730F700BD
:10072000F70B902B800B872B8A110A12762C8401F1
:1007300083131F308305713083168F000F088312D7
:10074000A0132008831687008312871783160317C8
:100750000908C039890003131F129F1200300317C4
:1007600088008312870188018901FF300313A000EC
:10077000831603170908C039890003131F129F123B
:10078000003003178800831203131F139F1383166F
:100790009F1383121F149412A0122008831687003F
:1007A000831220162008831687008312A0112008C8
:1007B0008316870001308312940000308316940062
:1007C0000108C73908388100831290010030F80011
:1007D00092000030831692008312201520088316A1
:1007E00087008312970183169B019C0101309D00B5
:1007F0008312031787018801890103138B280430B2
:1008000003178D0000308F000313EA201530031703
:100810008D0000308F000313EA20822A7908A2009D
:100820007808A100922A7908A4007808A300A22AD7
:100830007908A6007808A500213003178D00003044
:100840008F000313EA202C3003178D0000308F0037
:10085000031007300313A700B222103084002208CF
:10086000A8002108A70001232030B000C6200D30C9
:10087000B000C6200A30B000C620333003178D0008
:1008800000308F00031007300313A700B22210308E
:1008900084002408A8002308A70001232030B0000A
:1008A000C6200D30B000C6200A30B000C6203A3055
:1008B00003178D0000308F00031007300313A700CB
:1008C000B222103084002608A8002508A7000123C2
:1008D0002030B000C6200D30B000C6200A30B00075
:1008E000C6200830A700FA30A800812BA70B732C74
:0408F0000D2C630068
:04400E00F52CFF3F4F
:00000001FF
;PIC16F887
;CRC=01BF CREATED="11-5-13 10:50"
/Modules/Sensors/IMU01A/SW/PIC16F887/main.lst
0,0 → 1,3085
CCS PCM C Compiler, Version 4.106, 47914 11-5-13 10:50
 
Filename: D:\Honza\MLAB\Modules\Sensors\IMU01A\SW\PIC16F887\main.lst
 
ROM used: 1146 words (14%)
Largest free fragment is 2048
RAM used: 13 (4%) at main() level
26 (7%) worst case
Stack: 3 locations
 
*
0000: MOVLW 03
0001: MOVWF 0A
0002: GOTO 397
0003: NOP
.................... //Akcelerometr IMU01A
.................... //(c) MLAB Jan Chroust 2013
....................
....................
.................... #include <main.h>
.................... #include <16F887.h>
.................... //////// Standard Header file for the PIC16F887 device ////////////////
.................... #device PIC16F887
.................... #list
....................
.................... #device adc=8
....................
.................... #FUSES NOWDT //No Watch Dog Timer
.................... #FUSES INTRC //Internal RC Osc
.................... #FUSES NOPUT //No Power Up Timer
.................... #FUSES MCLR //Master Clear pin enabled
.................... #FUSES NOPROTECT //Code not protected from reading
.................... #FUSES NOCPD //No EE protection
.................... #FUSES NOBROWNOUT //No brownout reset
.................... #FUSES IESO //Internal External Switch Over mode enabled
.................... #FUSES FCMEN //Fail-safe clock monitor enabled
.................... #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
.................... #FUSES NODEBUG //No Debug mode for ICD
.................... #FUSES NOWRT //Program memory not write protected
.................... #FUSES BORV40 //Brownout reset at 4.0V
....................
.................... #use delay(clock=8000000)
*
0381: MOVLW 28
0382: MOVWF 04
0383: BCF 03.7
0384: MOVF 00,W
0385: BTFSC 03.2
0386: GOTO 394
0387: MOVLW 02
0388: MOVWF 78
0389: CLRF 77
038A: DECFSZ 77,F
038B: GOTO 38A
038C: DECFSZ 78,F
038D: GOTO 389
038E: MOVLW 97
038F: MOVWF 77
0390: DECFSZ 77,F
0391: GOTO 390
0392: DECFSZ 00,F
0393: GOTO 387
0394: BCF 0A.3
0395: BCF 0A.4
0396: GOTO 476 (RETURN)
....................
....................
....................
.................... #define PIN_SDA PIN_C4
.................... #define PIN_SCL PIN_C3
.................... #use i2c(master, sda=PIN_SDA, scl=PIN_SCL) //I2C
*
0041: MOVLW 08
0042: MOVWF 78
0043: NOP
0044: BCF 07.3
0045: BCF 20.3
0046: MOVF 20,W
0047: BSF 03.5
0048: MOVWF 07
0049: NOP
004A: BCF 03.5
004B: RLF 2F,F
004C: BCF 07.4
004D: BTFSS 03.0
004E: GOTO 055
004F: BSF 20.4
0050: MOVF 20,W
0051: BSF 03.5
0052: MOVWF 07
0053: GOTO 059
0054: BCF 03.5
0055: BCF 20.4
0056: MOVF 20,W
0057: BSF 03.5
0058: MOVWF 07
0059: NOP
005A: BCF 03.5
005B: BSF 20.3
005C: MOVF 20,W
005D: BSF 03.5
005E: MOVWF 07
005F: BCF 03.5
0060: BTFSS 07.3
0061: GOTO 060
0062: DECFSZ 78,F
0063: GOTO 043
0064: NOP
0065: BCF 07.3
0066: BCF 20.3
0067: MOVF 20,W
0068: BSF 03.5
0069: MOVWF 07
006A: NOP
006B: BCF 03.5
006C: BSF 20.4
006D: MOVF 20,W
006E: BSF 03.5
006F: MOVWF 07
0070: NOP
0071: NOP
0072: BCF 03.5
0073: BSF 20.3
0074: MOVF 20,W
0075: BSF 03.5
0076: MOVWF 07
0077: BCF 03.5
0078: BTFSS 07.3
0079: GOTO 078
007A: CLRF 78
007B: NOP
007C: BTFSC 07.4
007D: BSF 78.0
007E: BCF 07.3
007F: BCF 20.3
0080: MOVF 20,W
0081: BSF 03.5
0082: MOVWF 07
0083: BCF 03.5
0084: BCF 07.4
0085: BCF 20.4
0086: MOVF 20,W
0087: BSF 03.5
0088: MOVWF 07
0089: BCF 03.5
008A: RETURN
*
0130: MOVLW 08
0131: MOVWF 30
0132: MOVF 77,W
0133: MOVWF 31
0134: BSF 20.4
0135: MOVF 20,W
0136: BSF 03.5
0137: MOVWF 07
0138: NOP
0139: BCF 03.5
013A: BSF 20.3
013B: MOVF 20,W
013C: BSF 03.5
013D: MOVWF 07
013E: BCF 03.5
013F: BTFSS 07.3
0140: GOTO 13F
0141: BTFSC 07.4
0142: BSF 03.0
0143: BTFSS 07.4
0144: BCF 03.0
0145: RLF 78,F
0146: NOP
0147: BCF 20.3
0148: MOVF 20,W
0149: BSF 03.5
014A: MOVWF 07
014B: BCF 03.5
014C: BCF 07.3
014D: DECFSZ 30,F
014E: GOTO 134
014F: BSF 20.4
0150: MOVF 20,W
0151: BSF 03.5
0152: MOVWF 07
0153: NOP
0154: BCF 03.5
0155: BCF 07.4
0156: MOVF 31,W
0157: BTFSC 03.2
0158: GOTO 15E
0159: BCF 20.4
015A: MOVF 20,W
015B: BSF 03.5
015C: MOVWF 07
015D: BCF 03.5
015E: NOP
015F: BSF 20.3
0160: MOVF 20,W
0161: BSF 03.5
0162: MOVWF 07
0163: BCF 03.5
0164: BTFSS 07.3
0165: GOTO 164
0166: NOP
0167: BCF 07.3
0168: BCF 20.3
0169: MOVF 20,W
016A: BSF 03.5
016B: MOVWF 07
016C: NOP
016D: BCF 03.5
016E: BCF 07.4
016F: BCF 20.4
0170: MOVF 20,W
0171: BSF 03.5
0172: MOVWF 07
0173: BCF 03.5
0174: RETURN
.................... #use rs232(baud=9600,parity=N,xmit=PIN_C7,rcv=PIN_C6,bits=8) //rcv TXD xmit RXD
*
00C6: BCF 20.7
00C7: MOVF 20,W
00C8: BSF 03.5
00C9: MOVWF 07
00CA: BCF 03.5
00CB: BCF 07.7
00CC: MOVLW 08
00CD: MOVWF 78
00CE: GOTO 0CF
00CF: NOP
00D0: BSF 78.7
00D1: GOTO 0E0
00D2: BCF 78.7
00D3: RRF 30,F
00D4: BTFSC 03.0
00D5: BSF 07.7
00D6: BTFSS 03.0
00D7: BCF 07.7
00D8: BSF 78.6
00D9: GOTO 0E0
00DA: BCF 78.6
00DB: DECFSZ 78,F
00DC: GOTO 0D3
00DD: GOTO 0DE
00DE: NOP
00DF: BSF 07.7
00E0: MOVLW 3F
00E1: MOVWF 04
00E2: DECFSZ 04,F
00E3: GOTO 0E2
00E4: NOP
00E5: BTFSC 78.7
00E6: GOTO 0D2
00E7: BTFSC 78.6
00E8: GOTO 0DA
00E9: RETURN
.................... #include <math.h>
.................... ////////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996,2008 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS C ////
.................... //// compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, reproduction ////
.................... //// or distribution is permitted without written permission. ////
.................... //// Derivative programs created using this software in object code ////
.................... //// form are not restricted in any way. ////
.................... ////////////////////////////////////////////////////////////////////////////
.................... //// ////
.................... //// History: ////
.................... //// * 9/20/2001 : Improvments are made to sin/cos code. ////
.................... //// The code now is small, much faster, ////
.................... //// and more accurate. ////
.................... //// * 2/21/2007 : Compiler handles & operator differently and does
.................... //// not return generic (int8 *) so type cast is done ////
.................... //// ////
.................... ////////////////////////////////////////////////////////////////////////////
....................
.................... #ifndef MATH_H
.................... #define MATH_H
....................
.................... #ifdef PI
.................... #undef PI
.................... #endif
.................... #define PI 3.1415926535897932
....................
....................
.................... #define SQRT2 1.4142135623730950
....................
.................... //float const ps[4] = {5.9304945, 21.125224, 8.9403076, 0.29730279};
.................... //float const qs[4] = {1.0000000, 15.035723, 17.764134, 2.4934718};
....................
.................... ///////////////////////////// Round Functions //////////////////////////////
....................
.................... float32 CEIL_FLOOR(float32 x, unsigned int8 n)
.................... {
.................... float32 y, res;
.................... unsigned int16 l;
.................... int1 s;
....................
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y <= 32768.0)
.................... res = (float32)(unsigned int16)y;
....................
.................... else if (y < 10000000.0)
.................... {
.................... l = (unsigned int16)(y/32768.0);
.................... y = 32768.0*(y/32768.0 - (float32)l);
.................... res = 32768.0*(float32)l;
.................... res += (float32)(unsigned int16)y;
.................... }
....................
.................... else
.................... res = y;
....................
.................... y = y - (float32)(unsigned int16)y;
....................
.................... if (s)
.................... res = -res;
....................
.................... if (y != 0)
.................... {
.................... if (s == 1 && n == 0)
.................... res -= 1.0;
....................
.................... if (s == 0 && n == 1)
.................... res += 1.0;
.................... }
.................... if (x == 0)
.................... res = 0;
....................
.................... return (res);
.................... }
....................
.................... // Overloaded Functions to take care for new Data types in PCD
.................... // Overloaded function CEIL_FLOOR() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 CEIL_FLOOR(float48 x, unsigned int8 n)
.................... {
.................... float48 y, res;
.................... unsigned int16 l;
.................... int1 s;
....................
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y <= 32768.0)
.................... res = (float48)(unsigned int16)y;
....................
.................... else if (y < 10000000.0)
.................... {
.................... l = (unsigned int16)(y/32768.0);
.................... y = 32768.0*(y/32768.0 - (float48)l);
.................... res = 32768.0*(float32)l;
.................... res += (float48)(unsigned int16)y;
.................... }
....................
.................... else
.................... res = y;
....................
.................... y = y - (float48)(unsigned int16)y;
....................
.................... if (s)
.................... res = -res;
....................
.................... if (y != 0)
.................... {
.................... if (s == 1 && n == 0)
.................... res -= 1.0;
....................
.................... if (s == 0 && n == 1)
.................... res += 1.0;
.................... }
.................... if (x == 0)
.................... res = 0;
....................
.................... return (res);
.................... }
....................
....................
.................... // Overloaded function CEIL_FLOOR() for data type - Float64
.................... float64 CEIL_FLOOR(float64 x, unsigned int8 n)
.................... {
.................... float64 y, res;
.................... unsigned int16 l;
.................... int1 s;
....................
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y <= 32768.0)
.................... res = (float64)(unsigned int16)y;
....................
.................... else if (y < 10000000.0)
.................... {
.................... l = (unsigned int16)(y/32768.0);
.................... y = 32768.0*(y/32768.0 - (float64)l);
.................... res = 32768.0*(float64)l;
.................... res += (float64)(unsigned int16)y;
.................... }
....................
.................... else
.................... res = y;
....................
.................... y = y - (float64)(unsigned int16)y;
....................
.................... if (s)
.................... res = -res;
....................
.................... if (y != 0)
.................... {
.................... if (s == 1 && n == 0)
.................... res -= 1.0;
....................
.................... if (s == 0 && n == 1)
.................... res += 1.0;
.................... }
.................... if (x == 0)
.................... res = 0;
....................
.................... return (res);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float floor(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : rounds down the number x.
.................... // Date : N/A
.................... //
.................... float32 floor(float32 x)
.................... {
.................... return CEIL_FLOOR(x, 0);
.................... }
.................... // Following 2 functions are overloaded functions of floor() for PCD
.................... // Overloaded function floor() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 floor(float48 x)
.................... {
.................... return CEIL_FLOOR(x, 0);
.................... }
....................
.................... // Overloaded function floor() for data type - Float64
.................... float64 floor(float64 x)
.................... {
.................... return CEIL_FLOOR(x, 0);
.................... }
.................... #endif
....................
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float ceil(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : rounds up the number x.
.................... // Date : N/A
.................... //
.................... float32 ceil(float32 x)
.................... {
.................... return CEIL_FLOOR(x, 1);
.................... }
.................... // Following 2 functions are overloaded functions of ceil() for PCD
.................... // Overloaded function ceil() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 ceil(float48 x)
.................... {
.................... return CEIL_FLOOR(x, 1);
.................... }
....................
.................... // Overloaded function ceil() for data type - Float64
.................... float64 ceil(float64 x)
.................... {
.................... return CEIL_FLOOR(x, 1);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float fabs(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : Computes the absolute value of floating point number x
.................... // Returns : returns the absolute value of x
.................... // Date : N/A
.................... //
.................... #define fabs abs
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float fmod(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : Computes the floating point remainder of x/y
.................... // Returns : returns the value of x= i*y, for some integer i such that, if y
.................... // is non zero, the result has the same isgn of x na dmagnitude less than the
.................... // magnitude of y. If y is zero then a domain error occurs.
.................... // Date : N/A
.................... //
....................
.................... float fmod(float32 x,float32 y)
.................... {
.................... float32 i;
.................... if (y!=0.0)
.................... {
.................... i=(x/y < 0.0)? ceil(x/y): floor(x/y);
.................... return(x-(i*y));
.................... }
.................... else
.................... {
.................... #ifdef _ERRNO
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... }
.................... }
.................... //Overloaded function for fmod() for PCD
.................... // Overloaded function fmod() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 fmod(float48 x,float48 y)
.................... {
.................... float48 i;
.................... if (y!=0.0)
.................... {
.................... i=(x/y < 0.0)? ceil(x/y): floor(x/y);
.................... return(x-(i*y));
.................... }
.................... else
.................... {
.................... #ifdef _ERRNO
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... }
.................... }
.................... // Overloaded function fmod() for data type - Float64
.................... float64 fmod(float64 x,float64 y)
.................... {
.................... float64 i;
.................... if (y!=0.0)
.................... {
.................... i=(x/y < 0.0)? ceil(x/y): floor(x/y);
.................... return(x-(i*y));
.................... }
.................... else
.................... {
.................... #ifdef _ERRNO
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... }
.................... }
.................... #endif
.................... //////////////////// Exponential and logarithmic functions ////////////////////
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float exp(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the value (e^x)
.................... // Date : N/A
.................... //
.................... #define LN2 0.6931471805599453
....................
.................... float const pe[6] = {0.000207455774, 0.00127100575, 0.00965065093,
.................... 0.0554965651, 0.240227138, 0.693147172};
....................
....................
.................... float32 exp(float32 x)
.................... {
.................... float32 y, res, r;
.................... #if defined(__PCD__)
.................... int8 data1;
.................... #endif
.................... signed int8 n;
.................... int1 s;
.................... #ifdef _ERRNO
.................... if(x > 88.722838)
.................... {
.................... errno=ERANGE;
.................... return(0);
.................... }
.................... #endif
.................... n = (signed int16)(x/LN2);
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... n = -n;
.................... y = -y;
.................... }
....................
.................... res = 0.0;
.................... #if !defined(__PCD__)
.................... *((unsigned int8 *)(&res)) = n + 0x7F;
.................... #endif
....................
.................... #if defined(__PCD__) // Takes care of IEEE format for PCD
.................... data1 = n+0x7F;
.................... if(bit_test(data1,0))
.................... bit_set(*(((unsigned int8 *)(&res)+2)),7);
.................... rotate_right(&data1,1);
.................... bit_clear(data1,7);
.................... *(((unsigned int8 *)(&res)+3)) = data1;
.................... #endif
....................
.................... y = y/LN2 - (float32)n;
....................
.................... r = pe[0]*y + pe[1];
.................... r = r*y + pe[2];
.................... r = r*y + pe[3];
.................... r = r*y + pe[4];
.................... r = r*y + pe[5];
....................
.................... res = res*(1.0 + y*r);
....................
.................... if (s)
.................... res = 1.0/res;
.................... return(res);
.................... }
....................
....................
.................... //Overloaded function for exp() for PCD
.................... // Overloaded function exp() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 exp(float48 x)
.................... {
.................... float48 y, res, r;
.................... int8 data1;
.................... signed int8 n;
.................... int1 s;
.................... #ifdef _ERRNO
.................... if(x > 88.722838)
.................... {
.................... errno=ERANGE;
.................... return(0);
.................... }
.................... #endif
.................... n = (signed int16)(x/LN2);
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... n = -n;
.................... y = -y;
.................... }
....................
.................... res = 0.0;
....................
.................... data1 = n+0x7F;
.................... if(bit_test(data1,0))
.................... bit_set(*(((unsigned int8 *)(&res)+4)),7);
.................... rotate_right(&data1,1);
.................... bit_clear(data1,7);
.................... *(((unsigned int8 *)(&res)+5)) = data1;
....................
.................... y = y/LN2 - (float48)n;
....................
.................... r = pe[0]*y + pe[1];
.................... r = r*y + pe[2];
.................... r = r*y + pe[3];
.................... r = r*y + pe[4];
.................... r = r*y + pe[5];
....................
.................... res = res*(1.0 + y*r);
....................
.................... if (s)
.................... res = 1.0/res;
.................... return(res);
.................... }
....................
.................... // Overloaded function exp() for data type - Float64
.................... float64 exp(float64 x)
.................... {
.................... float64 y, res, r;
.................... unsigned int16 data1, data2;
.................... unsigned int16 *p;
.................... signed int16 n;
.................... int1 s;
.................... #ifdef _ERRNO
.................... if(x > 709.7827128)
.................... {
.................... errno=ERANGE;
.................... return(0);
.................... }
.................... #endif
.................... n = (signed int16)(x/LN2);
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... n = -n;
.................... y = -y;
.................... }
....................
.................... res = 0.0;
....................
.................... #if !defined(__PCD__)
.................... *((unsigned int16 *)(&res)) = n + 0x7F;
.................... #endif
.................... p= (((unsigned int16 *)(&res))+3);
.................... data1 = *p;
.................... data2 = *p;
.................... data1 = n + 0x3FF;
.................... data1 = data1 <<4;
.................... if(bit_test(data2,15))
.................... bit_set(data1,15);
.................... data2 = data2 & 0x000F;
.................... data1 ^= data2;
....................
.................... *(((unsigned int16 *)(&res)+3)) = data1;
....................
....................
.................... y = y/LN2 - (float64)n;
....................
.................... r = pe[0]*y + pe[1];
.................... r = r*y + pe[2];
.................... r = r*y + pe[3];
.................... r = r*y + pe[4];
.................... r = r*y + pe[5];
....................
.................... res = res*(1.0 + y*r);
....................
.................... if (s)
.................... res = 1.0/res;
.................... return(res);
.................... }
....................
.................... #ENDIF
....................
....................
.................... /************************************************************/
....................
.................... float32 const pl[4] = {0.45145214, -9.0558803, 26.940971, -19.860189};
.................... float32 const ql[4] = {1.0000000, -8.1354259, 16.780517, -9.9300943};
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float log(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the the natural log of x
.................... // Date : N/A
.................... //
.................... float32 log(float32 x)
.................... {
.................... float32 y, res, r, y2;
.................... #if defined(__PCD__)
.................... unsigned int8 data1,data2;
.................... #endif
.................... signed int8 n;
.................... #ifdef _ERRNO
.................... if(x <0)
.................... {
.................... errno=EDOM;
.................... }
.................... if(x ==0)
.................... {
.................... errno=ERANGE;
.................... return(0);
.................... }
.................... #endif
.................... y = x;
....................
.................... if (y != 1.0)
.................... {
.................... #if !defined(__PCD__)
.................... *((unsigned int8 *)(&y)) = 0x7E;
.................... #endif
....................
.................... #if defined(__PCD__) // Takes care of IEEE format
.................... data2 = *(((unsigned int8 *)(&y))+3);
.................... *(((unsigned int8 *)(&y))+3) = 0x3F;
.................... data1 = *(((unsigned int8 *)(&y))+2);
.................... bit_clear(data1,7);
.................... *(((unsigned int8 *)(&y))+2) = data1;
.................... if(bit_test(data2,7))
.................... bit_set(*(((unsigned int8 *)(&y))+3),7);
.................... #endif
....................
.................... y = (y - 1.0)/(y + 1.0);
....................
.................... y2=y*y;
....................
.................... res = pl[0]*y2 + pl[1];
.................... res = res*y2 + pl[2];
.................... res = res*y2 + pl[3];
....................
.................... r = ql[0]*y2 + ql[1];
.................... r = r*y2 + ql[2];
.................... r = r*y2 + ql[3];
....................
.................... res = y*res/r;
.................... #if !defined(__PCD__)
.................... n = *((unsigned int8 *)(&x)) - 0x7E;
.................... #endif
.................... #if defined(__PCD__)
.................... data1 = *(((unsigned int8 *)(&x)+3));
.................... rotate_left(&data1,1);
.................... data2 = *(((unsigned int8 *)(&x)+2));
.................... if(bit_test (data2,7))
.................... bit_set(data1,0);
.................... n = data1 - 0x7E;
.................... #endif
....................
.................... if (n<0)
.................... r = -(float32)-n;
.................... else
.................... r = (float32)n;
....................
.................... res += r*LN2;
.................... }
....................
.................... else
.................... res = 0.0;
....................
.................... return(res);
.................... }
....................
.................... //Overloaded function for log() for PCD
.................... // Overloaded function log() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 log(float48 x)
.................... {
.................... float48 y, res, r, y2;
.................... unsigned int8 data1,data2;
.................... signed int8 n;
.................... #ifdef _ERRNO
.................... if(x <0)
.................... {
.................... errno=EDOM;
.................... }
.................... if(x ==0)
.................... {
.................... errno=ERANGE;
.................... return(0);
.................... }
.................... #endif
.................... y = x;
....................
.................... if (y != 1.0)
.................... {
....................
.................... #if !defined(__PCD__)
.................... *((unsigned int8 *)(&y)) = 0x7E;
.................... #endif
.................... data2 = *(((unsigned int8 *)(&y))+5);
.................... *(((unsigned int8 *)(&y))+5) = 0x3F;
.................... data1 = *(((unsigned int8 *)(&y))+4);
.................... bit_clear(data1,7);
.................... *(((unsigned int8 *)(&y))+4) = data1;
....................
.................... if(bit_test(data2,7))
.................... bit_set(*(((unsigned int8 *)(&y))+4),7);
.................... y = (y - 1.0)/(y + 1.0);
....................
.................... y2=y*y;
....................
.................... res = pl[0]*y2 + pl[1];
.................... res = res*y2 + pl[2];
.................... res = res*y2 + pl[3];
....................
.................... r = ql[0]*y2 + ql[1];
.................... r = r*y2 + ql[2];
.................... r = r*y2 + ql[3];
....................
.................... res = y*res/r;
....................
.................... data1 = *(((unsigned int8 *)(&x)+5));
.................... rotate_left(&data1,1);
.................... data2 = *(((unsigned int8 *)(&x)+4));
.................... if(bit_test (data2,7))
.................... bit_set(data1,0);
....................
.................... n = data1 - 0x7E;
....................
.................... if (n<0)
.................... r = -(float48)-n;
.................... else
.................... r = (float48)n;
....................
.................... res += r*LN2;
.................... }
....................
.................... else
.................... res = 0.0;
....................
.................... return(res);
.................... }
....................
.................... // Overloaded function log() for data type - Float48
.................... #if defined(__PCD__)
.................... float32 const pl_64[4] = {0.45145214, -9.0558803, 26.940971, -19.860189};
.................... float32 const ql_64[4] = {1.0000000, -8.1354259, 16.780517, -9.9300943};
.................... #endif
.................... float64 log(float64 x)
.................... {
.................... float64 y, res, r, y2;
.................... unsigned int16 data1,data2;
.................... unsigned int16 *p;
.................... signed int16 n;
.................... #ifdef _ERRNO
.................... if(x <0)
.................... {
.................... errno=EDOM;
.................... }
.................... if(x ==0)
.................... {
.................... errno=ERANGE;
.................... return(0);
.................... }
.................... #endif
.................... y = x;
....................
.................... if (y != 1.0)
.................... {
.................... #if !defined(__PCD__)
.................... *((unsigned int8 *)(&y)) = 0x7E;
.................... #endif
.................... p= (((unsigned int16 *)(&y))+3);
.................... data1 = *p;
.................... data2 = *p;
.................... data1 = 0x3FE;
.................... data1 = data1 <<4;
.................... if(bit_test (data2,15))
.................... bit_set(data1,15);
.................... data2 = data2 & 0x000F;
.................... data1 ^=data2;
....................
.................... *p = data1;
....................
.................... y = (y - 1.0)/(y + 1.0);
....................
.................... y2=y*y;
....................
.................... res = pl_64[0]*y2 + pl_64[1];
.................... res = res*y2 + pl_64[2];
.................... res = res*y2 + pl_64[3];
....................
.................... r = ql_64[0]*y2 + ql_64[1];
.................... r = r*y2 + ql_64[2];
.................... r = r*y2 + ql_64[3];
....................
.................... res = y*res/r;
....................
.................... p= (((unsigned int16 *)(&x))+3);
.................... data1 = *p;
.................... bit_clear(data1,15);
.................... data1 = data1 >>4;
.................... n = data1 - 0x3FE;
....................
....................
.................... if (n<0)
.................... r = -(float64)-n;
.................... else
.................... r = (float64)n;
....................
.................... res += r*LN2;
.................... }
....................
.................... else
.................... res = 0.0;
....................
.................... return(res);
.................... }
.................... #endif
....................
....................
.................... #define LN10 2.3025850929940456
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float log10(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the the log base 10 of x
.................... // Date : N/A
.................... //
.................... float32 log10(float32 x)
.................... {
.................... float32 r;
....................
.................... r = log(x);
.................... r = r/LN10;
.................... return(r);
.................... }
....................
.................... //Overloaded functions for log10() for PCD
.................... // Overloaded function log10() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 log10(float48 x)
.................... {
.................... float48 r;
....................
.................... r = log(x);
.................... r = r/LN10;
.................... return(r);
.................... }
....................
.................... // Overloaded function log10() for data type - Float64
.................... float64 log10(float64 x)
.................... {
.................... float64 r;
....................
.................... r = log(x);
.................... r = r/LN10;
.................... return(r);
.................... }
.................... #endif
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float modf(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description :breaks the argument value int integral and fractional parts,
.................... // ach of which have the same sign as the argument. It stores the integral part
.................... // as a float in the object pointed to by the iptr
.................... // Returns : returns the signed fractional part of value.
.................... // Date : N/A
.................... //
....................
.................... float32 modf(float32 value,float32 *iptr)
.................... {
.................... *iptr=(value < 0.0)? ceil(value): floor(value);
.................... return(value - *iptr);
.................... }
.................... //Overloaded functions for modf() for PCD
.................... // Overloaded function modf() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 modf(float48 value,float48 *iptr)
.................... {
.................... *iptr=(value < 0.0)? ceil(value): floor(value);
.................... return(value - *iptr);
.................... }
.................... // Overloaded function modf() for data type - Float64
.................... float64 modf(float64 value,float64 *iptr)
.................... {
.................... *iptr=(value < 0.0)? ceil(value): floor(value);
.................... return(value - *iptr);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float pwr(float x,float y)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the value (x^y)
.................... // Date : N/A
.................... // Note : 0 is returned when the function will generate an imaginary number
.................... //
.................... float32 pwr(float32 x,float32 y)
.................... {
.................... if(0 > x && fmod(y, 1) == 0) {
.................... if(fmod(y, 2) == 0) {
.................... return (exp(log(-x) * y));
.................... } else {
.................... return (-exp(log(-x) * y));
.................... }
.................... } else if(0 > x && fmod(y, 1) != 0) {
.................... return 0;
.................... } else {
.................... if(x != 0 || 0 >= y) {
.................... return (exp(log(x) * y));
.................... }
.................... }
.................... }
.................... //Overloaded functions for pwr() for PCD
.................... // Overloaded function pwr() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 pwr(float48 x,float48 y)
.................... {
.................... if(0 > x && fmod(y, 1) == 0) {
.................... if(fmod(y, 2) == 0) {
.................... return (exp(log(-x) * y));
.................... } else {
.................... return (-exp(log(-x) * y));
.................... }
.................... } else if(0 > x && fmod(y, 1) != 0) {
.................... return 0;
.................... } else {
.................... if(x != 0 || 0 >= y) {
.................... return (exp(log(x) * y));
.................... }
.................... }
.................... }
.................... // Overloaded function pwr() for data type - Float64
.................... float64 pwr(float64 x,float64 y)
.................... {
.................... if(0 > x && fmod(y, 1) == 0) {
.................... if(fmod(y, 2) == 0) {
.................... return (exp(log(-x) * y));
.................... } else {
.................... return (-exp(log(-x) * y));
.................... }
.................... } else if(0 > x && fmod(y, 1) != 0) {
.................... return 0;
.................... } else {
.................... if(x != 0 || 0 >= y) {
.................... return (exp(log(x) * y));
.................... }
.................... }
.................... }
.................... #endif
....................
.................... //////////////////// Power functions ////////////////////
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float pow(float x,float y)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the value (x^y)
.................... // Date : N/A
.................... // Note : 0 is returned when the function will generate an imaginary number
.................... //
.................... float32 pow(float32 x,float32 y)
.................... {
.................... if(0 > x && fmod(y, 1) == 0) {
.................... if(fmod(y, 2) == 0) {
.................... return (exp(log(-x) * y));
.................... } else {
.................... return (-exp(log(-x) * y));
.................... }
.................... } else if(0 > x && fmod(y, 1) != 0) {
.................... return 0;
.................... } else {
.................... if(x != 0 || 0 >= y) {
.................... return (exp(log(x) * y));
.................... }
.................... }
.................... }
.................... //Overloaded functions for pow() for PCD
.................... // Overloaded function for pow() data type - Float48
.................... #if defined(__PCD__)
.................... float48 pow(float48 x,float48 y)
.................... {
.................... if(0 > x && fmod(y, 1) == 0) {
.................... if(fmod(y, 2) == 0) {
.................... return (exp(log(-x) * y));
.................... } else {
.................... return (-exp(log(-x) * y));
.................... }
.................... } else if(0 > x && fmod(y, 1) != 0) {
.................... return 0;
.................... } else {
.................... if(x != 0 || 0 >= y) {
.................... return (exp(log(x) * y));
.................... }
.................... }
.................... }
....................
.................... // Overloaded function pow() for data type - Float64
.................... float64 pow(float64 x,float64 y)
.................... {
.................... if(0 > x && fmod(y, 1) == 0) {
.................... if(fmod(y, 2) == 0) {
.................... return (exp(log(-x) * y));
.................... } else {
.................... return (-exp(log(-x) * y));
.................... }
.................... } else if(0 > x && fmod(y, 1) != 0) {
.................... return 0;
.................... } else {
.................... if(x != 0 || 0 >= y) {
.................... return (exp(log(x) * y));
.................... }
.................... }
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float sqrt(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the square root of x
.................... // Date : N/A
.................... //
.................... float32 sqrt(float32 x)
.................... {
.................... float32 y, res;
.................... #if defined(__PCD__)
.................... unsigned int16 data1,data2;
.................... #endif
.................... BYTE *p;
....................
.................... #ifdef _ERRNO
.................... if(x < 0)
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
....................
.................... if( x<=0.0)
.................... return(0.0);
....................
.................... y=x;
....................
.................... #if !defined(__PCD__)
.................... p=&y;
.................... (*p)=(BYTE)((((unsigned int16)(*p)) + 127) >> 1);
.................... #endif
....................
.................... #if defined(__PCD__)
.................... p = (((unsigned int8 *)(&y))+3);
.................... data1 = *(((unsigned int8 *)(&y))+3);
.................... data2 = *(((unsigned int8 *)(&y))+2);
.................... rotate_left(&data1,1);
.................... if(bit_test(data2,7))
.................... bit_set(data1,0);
.................... data1 = ((data1+127) >>1);
.................... bit_clear(data2,7);
.................... if(bit_test(data1,0))
.................... bit_set(data2,7);
.................... data1 = data1 >>1;
.................... *(((unsigned int8 *)(&y))+3) = data1;
.................... *(((unsigned int8 *)(&y))+2) = data2;
....................
.................... #endif
....................
.................... do {
.................... res=y;
.................... y+=(x/y);
....................
.................... #if !defined(__PCD__)
.................... (*p)--;
.................... #endif
....................
.................... #if defined(__PCD__)
.................... data1 = *(((unsigned int8 *)(&y))+3);
.................... data2 = *(((unsigned int8 *)(&y))+2);
.................... rotate_left(&data1,1);
.................... if(bit_test(data2,7))
.................... bit_set(data1,0);
.................... data1--;
.................... bit_clear(data2,7);
.................... if(bit_test(data1,0))
.................... bit_set(data2,7);
.................... data1 = data1 >>1;
.................... *(((unsigned int8 *)(&y))+3) = data1;
.................... *(((unsigned int8 *)(&y))+2) = data2;
....................
.................... #endif
.................... } while(res != y);
....................
.................... return(res);
.................... }
.................... //Overloaded functions for sqrt() for PCD
.................... // Overloaded function sqrt() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 sqrt(float48 x)
.................... {
.................... float48 y, res;
.................... unsigned int16 data1,data2;
.................... BYTE *p;
....................
.................... #ifdef _ERRNO
.................... if(x < 0)
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
....................
.................... if( x<=0.0)
.................... return(0.0);
....................
.................... y=x;
....................
.................... #if !defined(__PCD__)
.................... p=&y;
.................... (*p)=(BYTE)((((unsigned int16)(*p)) + 127) >> 1);
.................... #endif
....................
.................... #if defined(__PCD__)
.................... p = (((unsigned int8 *)(&y))+5);
.................... data1 = *(((unsigned int8 *)(&y))+5);
.................... data2 = *(((unsigned int8 *)(&y))+4);
.................... rotate_left(&data1,1);
.................... if(bit_test(data2,7))
.................... bit_set(data1,0);
.................... data1 = ((data1+127) >>1);
.................... bit_clear(data2,7);
.................... if(bit_test(data1,0))
.................... bit_set(data2,7);
.................... data1 = data1 >>1;
.................... *(((unsigned int8 *)(&y))+5) = data1;
.................... *(((unsigned int8 *)(&y))+4) = data2;
....................
.................... #endif
....................
.................... do {
.................... res=y;
.................... y+=(x/y);
....................
.................... #if !defined(__PCD__)
.................... (*p)--;
.................... #endif
....................
.................... data1 = *(((unsigned int8 *)(&y))+5);
.................... data2 = *(((unsigned int8 *)(&y))+4);
.................... rotate_left(&data1,1);
.................... if(bit_test(data2,7))
.................... bit_set(data1,0);
.................... data1--;
.................... bit_clear(data2,7);
.................... if(bit_test(data1,0))
.................... bit_set(data2,7);
.................... data1 = data1 >>1;
.................... *(((unsigned int8 *)(&y))+5) = data1;
.................... *(((unsigned int8 *)(&y))+4) = data2;
....................
.................... } while(res != y);
....................
.................... return(res);
.................... }
....................
.................... // Overloaded function sqrt() for data type - Float64
.................... float64 sqrt(float64 x)
.................... {
.................... float64 y, res;
.................... unsigned int16 *p;
.................... unsigned int16 temp1,temp2;
....................
.................... #ifdef _ERRNO
.................... if(x < 0)
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
....................
.................... if( x<=0.0)
.................... return(0.0);
....................
.................... y=x;
.................... p= (((unsigned int16 *)(&y))+3);
.................... temp1 = *p;
.................... temp2 = *p;
.................... bit_clear(temp1,15);
.................... temp1 = (temp1>>4)+1023;
.................... temp1 = temp1 >> 1;
.................... temp1 = (temp1<<4) & 0xFFF0;
.................... if(bit_test(temp2,15))
.................... bit_set(temp1,15);
.................... temp2 = temp2 & 0x000F;
.................... temp1 ^= temp2;
....................
.................... (*p) = temp1;
....................
.................... do {
.................... res=y;
.................... y+=(x/y);
.................... temp1 = *p;
.................... temp2 = *p;
.................... bit_clear(temp1,15);
.................... temp1 = (temp1>>4);
.................... temp1--;
.................... temp1 = (temp1<<4) & 0xFFF0;
.................... if(bit_test(temp2,15))
.................... bit_set(temp1,15);
.................... temp2 = temp2 & 0x000F;
.................... temp1 ^= temp2;
.................... (*p) = temp1;
....................
.................... } while(res != y);
....................
.................... return(res);
.................... }
.................... #endif
....................
.................... ////////////////////////////// Trig Functions //////////////////////////////
.................... #ifdef PI_DIV_BY_TWO
.................... #undef PI_DIV_BY_TWO
.................... #endif
.................... #define PI_DIV_BY_TWO 1.5707963267948966
.................... #ifdef TWOBYPI
.................... #undef TWOBYPI
.................... #define TWOBYPI 0.6366197723675813
.................... #endif
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float cos(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the cosine value of the angle x, which is in radian
.................... // Date : 9/20/2001
.................... //
.................... float32 cos(float32 x)
.................... {
.................... float32 y, t, t2 = 1.0;
.................... unsigned int8 quad, i;
.................... float32 frac;
.................... float32 p[6] = { //by the series definition for cosine
.................... -0.5, // sum ( ( (-1)^n * x^2n )/(2n)! )
.................... 0.04166666666667,
.................... -0.00138888888889,
.................... 0.00002480158730,
.................... -0.00000027557319,
.................... 0.00000000208767,
.................... //-0.00000000001147,
.................... // 0.00000000000005
.................... };
....................
.................... if (x < 0) x = -x; // absolute value of input
....................
.................... quad = (unsigned int8)(x / PI_DIV_BY_TWO); // quadrant
.................... frac = (x / PI_DIV_BY_TWO) - quad; // fractional part of input
.................... quad = quad % 4; // quadrant (0 to 3)
....................
.................... if (quad == 0 || quad == 2)
.................... t = frac * PI_DIV_BY_TWO;
.................... else if (quad == 1)
.................... t = (1-frac) * PI_DIV_BY_TWO;
.................... else // should be 3
.................... t = (frac-1) * PI_DIV_BY_TWO;
....................
.................... y = 1.0;
.................... t = t * t;
.................... for (i = 0; i <= 5; i++)
.................... {
.................... t2 = t2 * t;
.................... y = y + p[i] * t2;
.................... }
....................
.................... if (quad == 2 || quad == 1)
.................... y = -y; // correct sign
....................
.................... return (y);
.................... }
....................
....................
.................... //Overloaded functions for cos() for PCD
.................... // Overloaded function cos() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 cos(float48 x)
.................... {
.................... float48 y, t, t2 = 1.0;
.................... unsigned int8 quad, i;
.................... float48 frac;
.................... float48 p[6] = { //by the series definition for cosine
.................... -0.5, // sum ( ( (-1)^n * x^2n )/(2n)! )
.................... 0.04166666666667,
.................... -0.00138888888889,
.................... 0.00002480158730,
.................... -0.00000027557319,
.................... 0.00000000208767,
.................... //-0.00000000001147,
.................... // 0.00000000000005
.................... };
....................
.................... if (x < 0) x = -x; // absolute value of input
....................
.................... quad = (unsigned int8)(x / PI_DIV_BY_TWO); // quadrant
.................... frac = (x / PI_DIV_BY_TWO) - quad; // fractional part of input
.................... quad = quad % 4; // quadrant (0 to 3)
....................
.................... if (quad == 0 || quad == 2)
.................... t = frac * PI_DIV_BY_TWO;
.................... else if (quad == 1)
.................... t = (1-frac) * PI_DIV_BY_TWO;
.................... else // should be 3
.................... t = (frac-1) * PI_DIV_BY_TWO;
....................
.................... y = 0.999999999781;
.................... t = t * t;
.................... for (i = 0; i <= 5; i++)
.................... {
.................... t2 = t2 * t;
.................... y = y + p[i] * t2;
.................... }
....................
.................... if (quad == 2 || quad == 1)
.................... y = -y; // correct sign
....................
.................... return (y);
.................... }
....................
.................... // Overloaded function cos() for data type - Float48
.................... float64 cos(float64 x)
.................... {
.................... float64 y, t, t2 = 1.0;
.................... unsigned int8 quad, i;
.................... float64 frac;
.................... float64 p[6] = { //by the series definition for cosine
.................... -0.5, // sum ( ( (-1)^n * x^2n )/(2n)! )
.................... 0.04166666666667,
.................... -0.00138888888889,
.................... 0.00002480158730,
.................... -0.00000027557319,
.................... 0.00000000208767,
.................... //-0.00000000001147,
.................... // 0.00000000000005
.................... };
....................
.................... if (x < 0) x = -x; // absolute value of input
....................
.................... quad = (unsigned int8)(x / PI_DIV_BY_TWO); // quadrant
.................... frac = (x / PI_DIV_BY_TWO) - quad; // fractional part of input
.................... quad = quad % 4; // quadrant (0 to 3)
....................
.................... if (quad == 0 || quad == 2)
.................... t = frac * PI_DIV_BY_TWO;
.................... else if (quad == 1)
.................... t = (1-frac) * PI_DIV_BY_TWO;
.................... else // should be 3
.................... t = (frac-1) * PI_DIV_BY_TWO;
....................
.................... y = 0.999999999781;
.................... t = t * t;
.................... for (i = 0; i <= 5; i++)
.................... {
.................... t2 = t2 * t;
.................... y = y + p[i] * t2;
.................... }
....................
.................... if (quad == 2 || quad == 1)
.................... y = -y; // correct sign
....................
.................... return (y);
.................... }
....................
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float sin(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the sine value of the angle x, which is in radian
.................... // Date : 9/20/2001
.................... //
.................... float32 sin(float32 x)
.................... {
.................... return cos(x - PI_DIV_BY_TWO);
.................... }
....................
.................... //Overloaded functions for sin() for PCD
.................... // Overloaded function sin() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 sin(float48 x)
.................... {
.................... return cos(x - PI_DIV_BY_TWO);
.................... }
....................
.................... // Overloaded function sin() for data type - Float48
.................... float64 sin(float64 x)
.................... {
.................... return cos(x - PI_DIV_BY_TWO);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float tan(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the tangent value of the angle x, which is in radian
.................... // Date : 9/20/2001
.................... //
.................... float32 tan(float32 x)
.................... {
.................... float32 c, s;
....................
.................... c = cos(x);
.................... if (c == 0.0)
.................... return (1.0e+36);
....................
.................... s = sin(x);
.................... return(s/c);
.................... }
.................... //Overloaded functions for tan() for PCD
.................... // Overloaded function tan() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 tan(float48 x)
.................... {
.................... float48 c, s;
....................
.................... c = cos(x);
.................... if (c == 0.0)
.................... return (1.0e+36);
....................
.................... s = sin(x);
.................... return(s/c);
.................... }
....................
.................... // Overloaded function tan() for data type - Float48
.................... float64 tan(float64 x)
.................... {
.................... float64 c, s;
....................
.................... c = cos(x);
.................... if (c == 0.0)
.................... return (1.0e+36);
....................
.................... s = sin(x);
.................... return(s/c);
.................... }
.................... #endif
....................
.................... float32 const pas[3] = {0.49559947, -4.6145309, 5.6036290};
.................... float32 const qas[3] = {1.0000000, -5.5484666, 5.6036290};
....................
.................... float32 ASIN_COS(float32 x, unsigned int8 n)
.................... {
.................... float32 y, res, r, y2;
.................... int1 s;
.................... #ifdef _ERRNO
.................... if(x <-1 || x > 1)
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y > 0.5)
.................... {
.................... y = sqrt((1.0 - y)/2.0);
.................... n += 2;
.................... }
....................
.................... y2=y*y;
....................
.................... res = pas[0]*y2 + pas[1];
.................... res = res*y2 + pas[2];
....................
.................... r = qas[0]*y2 + qas[1];
.................... r = r*y2 + qas[2];
....................
.................... res = y*res/r;
....................
.................... if (n & 2) // |x| > 0.5
.................... res = PI_DIV_BY_TWO - 2.0*res;
.................... if (s)
.................... res = -res;
.................... if (n & 1) // take arccos
.................... res = PI_DIV_BY_TWO - res;
....................
.................... return(res);
.................... }
....................
.................... //Overloaded functions for ASIN_COS() for PCD
.................... // Overloaded function ASIN_COS() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 ASIN_COS(float48 x, unsigned int8 n)
.................... {
.................... float48 y, res, r, y2;
.................... int1 s;
.................... #ifdef _ERRNO
.................... if(x <-1 || x > 1)
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y > 0.5)
.................... {
.................... y = sqrt((1.0 - y)/2.0);
.................... n += 2;
.................... }
....................
.................... y2=y*y;
....................
.................... res = pas[0]*y2 + pas[1];
.................... res = res*y2 + pas[2];
....................
.................... r = qas[0]*y2 + qas[1];
.................... r = r*y2 + qas[2];
....................
.................... res = y*res/r;
....................
.................... if (n & 2) // |x| > 0.5
.................... res = PI_DIV_BY_TWO - 2.0*res;
.................... if (s)
.................... res = -res;
.................... if (n & 1) // take arccos
.................... res = PI_DIV_BY_TWO - res;
....................
.................... return(res);
.................... }
....................
.................... // Overloaded function ASIN_COS() for data type - Float64
.................... float64 ASIN_COS(float64 x, unsigned int8 n)
.................... {
.................... float64 y, res, r, y2;
.................... int1 s;
.................... #ifdef _ERRNO
.................... if(x <-1 || x > 1)
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... s = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y > 0.5)
.................... {
.................... y = sqrt((1.0 - y)/2.0);
.................... n += 2;
.................... }
....................
.................... y2=y*y;
....................
.................... res = pas[0]*y2 + pas[1];
.................... res = res*y2 + pas[2];
....................
.................... r = qas[0]*y2 + qas[1];
.................... r = r*y2 + qas[2];
....................
.................... res = y*res/r;
....................
.................... if (n & 2) // |x| > 0.5
.................... res = PI_DIV_BY_TWO - 2.0*res;
.................... if (s)
.................... res = -res;
.................... if (n & 1) // take arccos
.................... res = PI_DIV_BY_TWO - res;
....................
.................... return(res);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float asin(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the arcsine value of the value x.
.................... // Date : N/A
.................... //
.................... float32 asin(float32 x)
.................... {
.................... float32 r;
....................
.................... r = ASIN_COS(x, 0);
.................... return(r);
.................... }
.................... //Overloaded functions for asin() for PCD
.................... // Overloaded function asin() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 asin(float48 x)
.................... {
.................... float48 r;
....................
.................... r = ASIN_COS(x, 0);
.................... return(r);
.................... }
....................
.................... // Overloaded function asin() for data type - Float64
.................... float64 asin(float64 x)
.................... {
.................... float64 r;
....................
.................... r = ASIN_COS(x, 0);
.................... return(r);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float acos(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the arccosine value of the value x.
.................... // Date : N/A
.................... //
.................... float32 acos(float32 x)
.................... {
.................... float32 r;
....................
.................... r = ASIN_COS(x, 1);
.................... return(r);
.................... }
.................... //Overloaded functions for acos() for PCD
.................... // Overloaded function acos() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 acos(float48 x)
.................... {
.................... float48 r;
....................
.................... r = ASIN_COS(x, 1);
.................... return(r);
.................... }
....................
.................... // Overloaded function acos() for data type - Float64
.................... float64 acos(float64 x)
.................... {
.................... float64 r;
....................
.................... r = ASIN_COS(x, 1);
.................... return(r);
.................... }
.................... #endif
....................
.................... float32 const pat[4] = {0.17630401, 5.6710795, 22.376096, 19.818457};
.................... float32 const qat[4] = {1.0000000, 11.368190, 28.982246, 19.818457};
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float atan(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : returns the arctangent value of the value x.
.................... // Date : N/A
.................... //
.................... float32 atan(float32 x)
.................... {
.................... float32 y, res, r;
.................... int1 s, flag;
....................
.................... s = 0;
.................... flag = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y > 1.0)
.................... {
.................... y = 1.0/y;
.................... flag = 1;
.................... }
....................
.................... res = pat[0]*y*y + pat[1];
.................... res = res*y*y + pat[2];
.................... res = res*y*y + pat[3];
....................
.................... r = qat[0]*y*y + qat[1];
.................... r = r*y*y + qat[2];
.................... r = r*y*y + qat[3];
....................
.................... res = y*res/r;
....................
....................
.................... if (flag) // for |x| > 1
.................... res = PI_DIV_BY_TWO - res;
.................... if (s)
.................... res = -res;
....................
.................... return(res);
.................... }
.................... //Overloaded functions for atan() for PCD
.................... // Overloaded function atan() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 atan(float48 x)
.................... {
.................... float48 y, res, r;
.................... int1 s, flag;
....................
.................... s = 0;
.................... flag = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y > 1.0)
.................... {
.................... y = 1.0/y;
.................... flag = 1;
.................... }
....................
.................... res = pat[0]*y*y + pat[1];
.................... res = res*y*y + pat[2];
.................... res = res*y*y + pat[3];
....................
.................... r = qat[0]*y*y + qat[1];
.................... r = r*y*y + qat[2];
.................... r = r*y*y + qat[3];
....................
.................... res = y*res/r;
....................
....................
.................... if (flag) // for |x| > 1
.................... res = PI_DIV_BY_TWO - res;
.................... if (s)
.................... res = -res;
....................
.................... return(res);
.................... }
....................
.................... // Overloaded function atan() for data type - Float64
.................... float64 atan(float64 x)
.................... {
.................... float64 y, res, r;
.................... int1 s, flag;
....................
.................... s = 0;
.................... flag = 0;
.................... y = x;
....................
.................... if (x < 0)
.................... {
.................... s = 1;
.................... y = -y;
.................... }
....................
.................... if (y > 1.0)
.................... {
.................... y = 1.0/y;
.................... flag = 1;
.................... }
....................
.................... res = pat[0]*y*y + pat[1];
.................... res = res*y*y + pat[2];
.................... res = res*y*y + pat[3];
....................
.................... r = qat[0]*y*y + qat[1];
.................... r = r*y*y + qat[2];
.................... r = r*y*y + qat[3];
....................
.................... res = y*res/r;
....................
....................
.................... if (flag) // for |x| > 1
.................... res = PI_DIV_BY_TWO - res;
.................... if (s)
.................... res = -res;
....................
.................... return(res);
.................... }
.................... #endif
....................
.................... /////////////////////////////////////////////////////////////////////////////
.................... // float atan2(float y, float x)
.................... /////////////////////////////////////////////////////////////////////////////
.................... // Description :computes the principal value of arc tangent of y/x, using the
.................... // signs of both the arguments to determine the quadrant of the return value
.................... // Returns : returns the arc tangent of y/x.
.................... // Date : N/A
.................... //
....................
.................... float32 atan2(float32 y,float32 x)
.................... {
.................... float32 z;
.................... int1 sign;
.................... unsigned int8 quad;
.................... sign=0;
.................... quad=0; //quadrant
.................... quad=((y<=0.0)?((x<=0.0)?3:4):((x<0.0)?2:1));
.................... if(y<0.0)
.................... {
.................... sign=1;
.................... y=-y;
.................... }
.................... if(x<0.0)
.................... {
.................... x=-x;
.................... }
.................... if (x==0.0)
.................... {
.................... if(y==0.0)
.................... {
.................... #ifdef _ERRNO
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... }
.................... else
.................... {
.................... if(sign)
.................... {
.................... return (-(PI_DIV_BY_TWO));
.................... }
.................... else
.................... {
.................... return (PI_DIV_BY_TWO);
.................... }
.................... }
.................... }
.................... else
.................... {
.................... z=y/x;
.................... switch(quad)
.................... {
.................... case 1:
.................... {
.................... return atan(z);
.................... break;
.................... }
.................... case 2:
.................... {
.................... // return (atan(z)+PI_DIV_BY_TWO); //2L3122
.................... return (PI-atan(z));
.................... break;
.................... }
.................... case 3:
.................... {
.................... return (atan(z)-PI);
.................... break;
.................... }
.................... case 4:
.................... {
.................... return (-atan(z));
.................... break;
.................... }
.................... }
.................... }
.................... }
....................
.................... //Overloaded functions for atan2() for PCD
.................... // Overloaded function atan2() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 atan2(float48 y,float48 x)
.................... {
.................... float48 z;
.................... int1 sign;
.................... unsigned int8 quad;
.................... sign=0;
.................... quad=0; //quadrant
.................... quad=((y<=0.0)?((x<=0.0)?3:4):((x<0.0)?2:1));
.................... if(y<0.0)
.................... {
.................... sign=1;
.................... y=-y;
.................... }
.................... if(x<0.0)
.................... {
.................... x=-x;
.................... }
.................... if (x==0.0)
.................... {
.................... if(y==0.0)
.................... {
.................... #ifdef _ERRNO
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... }
.................... else
.................... {
.................... if(sign)
.................... {
.................... return (-(PI_DIV_BY_TWO));
.................... }
.................... else
.................... {
.................... return (PI_DIV_BY_TWO);
.................... }
.................... }
.................... }
.................... else
.................... {
.................... z=y/x;
.................... switch(quad)
.................... {
.................... case 1:
.................... {
.................... return atan(z);
.................... break;
.................... }
.................... case 2:
.................... {
.................... // return (atan(z)+PI_DIV_BY_TWO); //2L3122
.................... return (PI-atan(z));
.................... break;
.................... }
.................... case 3:
.................... {
.................... return (atan(z)-PI);
.................... break;
.................... }
.................... case 4:
.................... {
.................... return (-atan(z));
.................... break;
.................... }
.................... }
.................... }
.................... }
....................
.................... // Overloaded function atan2() for data type - Float64
.................... float64 atan2(float64 y,float64 x)
.................... {
.................... float64 z;
.................... int1 sign;
.................... unsigned int8 quad;
.................... sign=0;
.................... quad=0; //quadrant
.................... quad=((y<=0.0)?((x<=0.0)?3:4):((x<0.0)?2:1));
.................... if(y<0.0)
.................... {
.................... sign=1;
.................... y=-y;
.................... }
.................... if(x<0.0)
.................... {
.................... x=-x;
.................... }
.................... if (x==0.0)
.................... {
.................... if(y==0.0)
.................... {
.................... #ifdef _ERRNO
.................... {
.................... errno=EDOM;
.................... }
.................... #endif
.................... }
.................... else
.................... {
.................... if(sign)
.................... {
.................... return (-(PI_DIV_BY_TWO));
.................... }
.................... else
.................... {
.................... return (PI_DIV_BY_TWO);
.................... }
.................... }
.................... }
.................... else
.................... {
.................... z=y/x;
.................... switch(quad)
.................... {
.................... case 1:
.................... {
.................... return atan(z);
.................... break;
.................... }
.................... case 2:
.................... {
.................... // return (atan(z)+PI_DIV_BY_TWO); //2L3122
.................... return (PI-atan(z));
.................... break;
.................... }
.................... case 3:
.................... {
.................... return (atan(z)-PI);
.................... break;
.................... }
.................... case 4:
.................... {
.................... return (-atan(z));
.................... break;
.................... }
.................... }
.................... }
.................... }
.................... #endif
....................
.................... //////////////////// Hyperbolic functions ////////////////////
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float cosh(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : Computes the hyperbolic cosine value of x
.................... // Returns : returns the hyperbolic cosine value of x
.................... // Date : N/A
.................... //
....................
.................... float32 cosh(float32 x)
.................... {
.................... return ((exp(x)+exp(-x))/2);
.................... }
.................... //Overloaded functions for cosh() for PCD
.................... // Overloaded function cosh() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 cosh(float48 x)
.................... {
.................... return ((exp(x)+exp(-x))/2);
.................... }
....................
.................... // Overloaded function cosh() for data type - Float64
.................... float64 cosh(float64 x)
.................... {
.................... return ((exp(x)+exp(-x))/2);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float sinh(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : Computes the hyperbolic sine value of x
.................... // Returns : returns the hyperbolic sine value of x
.................... // Date : N/A
.................... //
....................
.................... float32 sinh(float32 x)
.................... {
....................
.................... return ((exp(x) - exp(-x))/2);
.................... }
.................... //Overloaded functions for sinh() for PCD
.................... // Overloaded function sinh() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 sinh(float48 x)
.................... {
....................
.................... return ((exp(x) - exp(-x))/2);
.................... }
....................
.................... // Overloaded function sinh() for data type - Float48
.................... float64 sinh(float64 x)
.................... {
....................
.................... return ((exp(x) - exp(-x))/2);
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float tanh(float x)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : Computes the hyperbolic tangent value of x
.................... // Returns : returns the hyperbolic tangent value of x
.................... // Date : N/A
.................... //
....................
.................... float32 tanh(float32 x)
.................... {
.................... return(sinh(x)/cosh(x));
.................... }
.................... //Overloaded functions for tanh() for PCD
.................... // Overloaded function tanh() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 tanh(float48 x)
.................... {
.................... return(sinh(x)/cosh(x));
.................... }
....................
.................... // Overloaded function tanh() for data type - Float64
.................... float64 tanh(float64 x)
.................... {
.................... return(sinh(x)/cosh(x));
.................... }
.................... #endif
....................
.................... ////////////////////////////////////////////////////////////////////////////
.................... // float frexp(float x, signed int *exp)
.................... ////////////////////////////////////////////////////////////////////////////
.................... // Description : breaks a floating point number into a normalized fraction and an integral
.................... // power of 2. It stores the integer in the signed int object pointed to by exp.
.................... // Returns : returns the value x, such that x is a double with magnitude in the interval
.................... // [1/2,1) or zero, and value equals x times 2 raised to the power *exp.If value is zero,
.................... // both parts of the result are zero.
.................... // Date : N/A
.................... //
....................
.................... #define LOG2 .30102999566398119521
.................... float32 frexp(float32 x, signed int8 *exp)
.................... {
.................... float32 res;
.................... int1 sign = 0;
.................... if(x == 0.0)
.................... {
.................... *exp=0;
.................... return (0.0);
.................... }
.................... if(x < 0.0)
.................... {
.................... x=-x;
.................... sign=1;
.................... }
.................... if (x > 1.0)
.................... {
.................... *exp=(ceil(log10(x)/LOG2));
.................... res=x/(pow(2, *exp));
.................... if (res == 1)
.................... {
.................... *exp=*exp+1;
.................... res=.5;
.................... }
.................... }
.................... else
.................... {
.................... if(x < 0.5)
.................... {
.................... *exp=-1;
.................... res=x*2;
.................... }
.................... else
.................... {
.................... *exp=0;
.................... res=x;
.................... }
.................... }
.................... if(sign)
.................... {
.................... res=-res;
.................... }
.................... return res;
.................... }
....................
.................... //Overloaded functions for frexp() for PCD
.................... // Overloaded function frexp() for data type - Float48
.................... #if defined(__PCD__)
.................... float48 frexp(float48 x, signed int8 *exp)
.................... {
.................... float48 res;
.................... int1 sign = 0;
.................... if(x == 0.0)
.................... {
.................... *exp=0;
.................... return (0.0);
.................... }
.................... if(x < 0.0)
.................... {
.................... x=-x;
.................... sign=1;
.................... }
.................... if (x > 1.0)
.................... {
.................... *exp=(ceil(log10(x)/LOG2));
.................... res=x/(pow(2, *exp));
.................... if (res == 1)
.................... {
.................... *exp=*exp+1;
.................... res=.5;
.................... }
.................... }
.................... else
.................... {
.................... if(x < 0.5)
.................... {
.................... *exp=-1;
.................... res=x*2;
.................... }
.................... else
.................... {
.................... *exp=0;
.................... res=x;
.................... }
.................... }
.................... if(sign)
.................... {
.................... res=-res;
.................... }
.................... return res;
.................... }
....................
.................... // Overloaded function frexp() for data type - Float64
.................... float64 frexp(float64 x, signed int8 *exp)
.................... {
.................... float64 res;
.................... int1 sign = 0;
.................... if(x == 0.0)
.................... {
.................... *exp=0;
.................... return (0.0);
.................... }
.................... if(x < 0.0)
.................... {
.................... x=-x;
.................... sign=1;
.................... }
.................... if (x > 1.0)
.................... {
.................... *exp=(ceil(log10(x)/LOG2));
.................... res=x/(pow(2, *exp));
.................... if (res == 1)
.................... {
.................... *exp=*exp+1;
.................... res=.5;
.................... }
.................... }
.................... else
.................... {
.................... if(x < 0.5)
.................... {
.................... *exp=-1;
.................... res=x*2;
.................... }
.................... else
.................... {
.................... *exp=0;
.................... res=x;
.................... }
.................... }
.................... if(sign)
.................... {
.................... res=-res;
.................... }
.................... return res;
.................... }
.................... #endif
....................
.................... //////////////////////////////////////////////////////////////////////////////
.................... // float ldexp(float x, signed int *exp)
.................... //////////////////////////////////////////////////////////////////////////////
.................... // Description : multiplies a floating point number by an integral power of 2.
.................... // Returns : returns the value of x times 2 raised to the power exp.
.................... // Date : N/A
.................... //
....................
.................... float32 ldexp(float32 value, signed int8 exp)
.................... {
.................... return (value * pow(2,exp));
.................... }
.................... //Overloaded functions for ldexp() for PCD
.................... // Overloaded function ldexp() for data type - Float48
....................
.................... #if defined(__PCD__)
.................... float48 ldexp(float48 value, signed int8 exp)
.................... {
.................... return (value * pow(2,exp));
.................... }
.................... // Overloaded function ldexp() for data type - Float64
.................... float64 ldexp(float64 value, signed int8 exp)
.................... {
.................... return (value * pow(2,exp));
.................... }
.................... #endif
....................
.................... #endif
....................
.................... #include <MMA8451Q.h>
.................... //Adresa obvodu
.................... #define AK_W 0x38 //adresa akcelerometru zápis
.................... #define AK_R 0x39 //adresa akcelerometru ètení
....................
....................
.................... #define AK_XH 0x01 //osa X LSB
.................... #define AK_XL 0x02 //osa X MSB
.................... #define AK_YH 0x03 //osa Y LSB
.................... #define AK_YL 0x04 //osa Y MSB
.................... #define AK_ZH 0x05 //osa Z LSB
.................... #define AK_ZL 0x06 //osa Z MSB
....................
....................
.................... #include "MMA8451Q.c"
.................... void setAK (void) //nastaveni akcelerometru
.................... {
.................... i2c_start();
*
008B: BSF 20.4
008C: MOVF 20,W
008D: BSF 03.5
008E: MOVWF 07
008F: NOP
0090: BCF 03.5
0091: BSF 20.3
0092: MOVF 20,W
0093: BSF 03.5
0094: MOVWF 07
0095: NOP
0096: BCF 03.5
0097: BCF 07.4
0098: BCF 20.4
0099: MOVF 20,W
009A: BSF 03.5
009B: MOVWF 07
009C: NOP
009D: BCF 03.5
009E: BCF 07.3
009F: BCF 20.3
00A0: MOVF 20,W
00A1: BSF 03.5
00A2: MOVWF 07
.................... I2C_Write(AK_W);
00A3: MOVLW 38
00A4: BCF 03.5
00A5: MOVWF 2F
00A6: CALL 041
.................... I2C_write(0x2A);
00A7: MOVLW 2A
00A8: MOVWF 2F
00A9: CALL 041
.................... I2C_write(0x01); //nastavi aktivni stav
00AA: MOVLW 01
00AB: MOVWF 2F
00AC: CALL 041
....................
.................... i2c_stop();
00AD: BCF 20.4
00AE: MOVF 20,W
00AF: BSF 03.5
00B0: MOVWF 07
00B1: NOP
00B2: BCF 03.5
00B3: BSF 20.3
00B4: MOVF 20,W
00B5: BSF 03.5
00B6: MOVWF 07
00B7: BCF 03.5
00B8: BTFSS 07.3
00B9: GOTO 0B8
00BA: NOP
00BB: GOTO 0BC
00BC: NOP
00BD: BSF 20.4
00BE: MOVF 20,W
00BF: BSF 03.5
00C0: MOVWF 07
00C1: NOP
.................... }
00C2: BCF 03.5
00C3: BCF 0A.3
00C4: BCF 0A.4
00C5: GOTO 3FF (RETURN)
....................
....................
.................... int16 akR (int8 H, int8 L) //vycitani hodnot z akcelerometru
.................... {
*
0175: CLRF 2B
0176: CLRF 2C
.................... unsigned int8 XL=0,XH=0;
.................... signed int16 x;
....................
.................... i2c_start();
0177: BSF 20.4
0178: MOVF 20,W
0179: BSF 03.5
017A: MOVWF 07
017B: NOP
017C: BCF 03.5
017D: BSF 20.3
017E: MOVF 20,W
017F: BSF 03.5
0180: MOVWF 07
0181: NOP
0182: BCF 03.5
0183: BCF 07.4
0184: BCF 20.4
0185: MOVF 20,W
0186: BSF 03.5
0187: MOVWF 07
0188: NOP
0189: BCF 03.5
018A: BCF 07.3
018B: BCF 20.3
018C: MOVF 20,W
018D: BSF 03.5
018E: MOVWF 07
.................... I2C_Write(AK_W);
018F: MOVLW 38
0190: BCF 03.5
0191: MOVWF 2F
0192: CALL 041
.................... I2C_write(H);
0193: MOVF 29,W
0194: MOVWF 2F
0195: CALL 041
.................... i2c_start();
0196: BSF 20.4
0197: MOVF 20,W
0198: BSF 03.5
0199: MOVWF 07
019A: NOP
019B: BCF 03.5
019C: BSF 20.3
019D: MOVF 20,W
019E: BSF 03.5
019F: MOVWF 07
01A0: NOP
01A1: BCF 03.5
01A2: BTFSS 07.3
01A3: GOTO 1A2
01A4: BCF 07.4
01A5: BCF 20.4
01A6: MOVF 20,W
01A7: BSF 03.5
01A8: MOVWF 07
01A9: NOP
01AA: BCF 03.5
01AB: BCF 07.3
01AC: BCF 20.3
01AD: MOVF 20,W
01AE: BSF 03.5
01AF: MOVWF 07
.................... I2C_Write(AK_R);
01B0: MOVLW 39
01B1: BCF 03.5
01B2: MOVWF 2F
01B3: CALL 041
.................... XH=i2c_read(0);
01B4: CLRF 77
01B5: CALL 130
01B6: MOVF 78,W
01B7: MOVWF 2C
.................... i2c_stop();
01B8: BCF 20.4
01B9: MOVF 20,W
01BA: BSF 03.5
01BB: MOVWF 07
01BC: NOP
01BD: BCF 03.5
01BE: BSF 20.3
01BF: MOVF 20,W
01C0: BSF 03.5
01C1: MOVWF 07
01C2: BCF 03.5
01C3: BTFSS 07.3
01C4: GOTO 1C3
01C5: NOP
01C6: GOTO 1C7
01C7: NOP
01C8: BSF 20.4
01C9: MOVF 20,W
01CA: BSF 03.5
01CB: MOVWF 07
01CC: NOP
....................
.................... i2c_start();
01CD: BCF 03.5
01CE: BSF 20.4
01CF: MOVF 20,W
01D0: BSF 03.5
01D1: MOVWF 07
01D2: NOP
01D3: BCF 03.5
01D4: BSF 20.3
01D5: MOVF 20,W
01D6: BSF 03.5
01D7: MOVWF 07
01D8: NOP
01D9: BCF 03.5
01DA: BCF 07.4
01DB: BCF 20.4
01DC: MOVF 20,W
01DD: BSF 03.5
01DE: MOVWF 07
01DF: NOP
01E0: BCF 03.5
01E1: BCF 07.3
01E2: BCF 20.3
01E3: MOVF 20,W
01E4: BSF 03.5
01E5: MOVWF 07
.................... I2C_Write(AK_W);
01E6: MOVLW 38
01E7: BCF 03.5
01E8: MOVWF 2F
01E9: CALL 041
.................... I2C_write(L);
01EA: MOVF 2A,W
01EB: MOVWF 2F
01EC: CALL 041
.................... i2c_start();
01ED: BSF 20.4
01EE: MOVF 20,W
01EF: BSF 03.5
01F0: MOVWF 07
01F1: NOP
01F2: BCF 03.5
01F3: BSF 20.3
01F4: MOVF 20,W
01F5: BSF 03.5
01F6: MOVWF 07
01F7: NOP
01F8: BCF 03.5
01F9: BTFSS 07.3
01FA: GOTO 1F9
01FB: BCF 07.4
01FC: BCF 20.4
01FD: MOVF 20,W
01FE: BSF 03.5
01FF: MOVWF 07
0200: NOP
0201: BCF 03.5
0202: BCF 07.3
0203: BCF 20.3
0204: MOVF 20,W
0205: BSF 03.5
0206: MOVWF 07
.................... I2C_Write(AK_R);
0207: MOVLW 39
0208: BCF 03.5
0209: MOVWF 2F
020A: CALL 041
.................... XL=i2c_read(0);
020B: CLRF 77
020C: CALL 130
020D: MOVF 78,W
020E: MOVWF 2B
.................... i2c_stop();
020F: BCF 20.4
0210: MOVF 20,W
0211: BSF 03.5
0212: MOVWF 07
0213: NOP
0214: BCF 03.5
0215: BSF 20.3
0216: MOVF 20,W
0217: BSF 03.5
0218: MOVWF 07
0219: BCF 03.5
021A: BTFSS 07.3
021B: GOTO 21A
021C: NOP
021D: GOTO 21E
021E: NOP
021F: BSF 20.4
0220: MOVF 20,W
0221: BSF 03.5
0222: MOVWF 07
0223: NOP
....................
.................... x = (((unsigned int16) XH << 8) + XL ); //prevod na 16bit hodnotu
0224: BCF 03.5
0225: CLRF 30
0226: MOVF 2C,W
0227: MOVWF 2F
0228: MOVWF 30
0229: CLRF 2F
022A: MOVF 2B,W
022B: ADDWF 2F,W
022C: MOVWF 78
022D: MOVF 30,W
022E: MOVWF 7A
022F: BTFSC 03.0
0230: INCF 7A,F
0231: MOVF 78,W
0232: MOVWF 2D
0233: MOVF 7A,W
0234: MOVWF 2E
.................... x=x/4;
0235: MOVF 2E,W
0236: MOVWF 30
0237: MOVF 2D,W
0238: MOVWF 2F
0239: CLRF 32
023A: MOVLW 04
023B: MOVWF 31
*
0279: MOVF 79,W
027A: MOVWF 2E
027B: MOVF 78,W
027C: MOVWF 2D
....................
.................... return x;
027D: MOVF 2D,W
027E: MOVWF 78
027F: MOVF 2E,W
0280: MOVWF 79
.................... }
0281: RETURN
....................
.................... int16 akX (void)
.................... {
.................... int16 X;
.................... X= akR (AK_XH, AK_XL);
0282: MOVLW 01
0283: MOVWF 29
0284: MOVLW 02
0285: MOVWF 2A
0286: CALL 175
0287: MOVF 79,W
0288: MOVWF 28
0289: MOVF 78,W
028A: MOVWF 27
.................... return X;
028B: MOVF 27,W
028C: MOVWF 78
028D: MOVF 28,W
028E: MOVWF 79
.................... }
028F: BCF 0A.3
0290: BCF 0A.4
0291: GOTO 40E (RETURN)
....................
.................... int16 akY (void)
.................... {
.................... int16 Y;
.................... Y= akR (AK_YH, AK_YL);
0292: MOVLW 03
0293: MOVWF 29
0294: MOVLW 04
0295: MOVWF 2A
0296: CALL 175
0297: MOVF 79,W
0298: MOVWF 28
0299: MOVF 78,W
029A: MOVWF 27
.................... return Y;
029B: MOVF 27,W
029C: MOVWF 78
029D: MOVF 28,W
029E: MOVWF 79
.................... }
029F: BCF 0A.3
02A0: BCF 0A.4
02A1: GOTO 413 (RETURN)
....................
.................... int16 akZ (void)
.................... {
.................... int16 Z;
.................... Z= akR (AK_ZH, AK_ZL);
02A2: MOVLW 05
02A3: MOVWF 29
02A4: MOVLW 06
02A5: MOVWF 2A
02A6: CALL 175
02A7: MOVF 79,W
02A8: MOVWF 28
02A9: MOVF 78,W
02AA: MOVWF 27
.................... return Z;
02AB: MOVF 27,W
02AC: MOVWF 78
02AD: MOVF 28,W
02AE: MOVWF 79
.................... }
02AF: BCF 0A.3
02B0: BCF 0A.4
02B1: GOTO 418 (RETURN)
....................
....................
....................
....................
....................
.................... signed int16 X, Y, Z; //promenne pro akcelerometr
....................
.................... void main()
.................... {
*
0397: CLRF 04
0398: BCF 03.7
0399: MOVLW 1F
039A: ANDWF 03,F
039B: MOVLW 71
039C: BSF 03.5
039D: MOVWF 0F
039E: MOVF 0F,W
039F: BCF 03.5
03A0: BCF 20.7
03A1: MOVF 20,W
03A2: BSF 03.5
03A3: MOVWF 07
03A4: BCF 03.5
03A5: BSF 07.7
03A6: BSF 03.5
03A7: BSF 03.6
03A8: MOVF 09,W
03A9: ANDLW C0
03AA: MOVWF 09
03AB: BCF 03.6
03AC: BCF 1F.4
03AD: BCF 1F.5
03AE: MOVLW 00
03AF: BSF 03.6
03B0: MOVWF 08
03B1: BCF 03.5
03B2: CLRF 07
03B3: CLRF 08
03B4: CLRF 09
.................... setup_adc_ports(NO_ANALOGS|VSS_VDD);
*
03B8: BSF 03.5
03B9: BSF 03.6
03BA: MOVF 09,W
03BB: ANDLW C0
03BC: MOVWF 09
03BD: BCF 03.6
03BE: BCF 1F.4
03BF: BCF 1F.5
03C0: MOVLW 00
03C1: BSF 03.6
03C2: MOVWF 08
.................... setup_adc(ADC_CLOCK_DIV_2);
03C3: BCF 03.5
03C4: BCF 03.6
03C5: BCF 1F.6
03C6: BCF 1F.7
03C7: BSF 03.5
03C8: BCF 1F.7
03C9: BCF 03.5
03CA: BSF 1F.0
.................... setup_spi(SPI_SS_DISABLED);
03CB: BCF 14.5
03CC: BCF 20.5
03CD: MOVF 20,W
03CE: BSF 03.5
03CF: MOVWF 07
03D0: BCF 03.5
03D1: BSF 20.4
03D2: MOVF 20,W
03D3: BSF 03.5
03D4: MOVWF 07
03D5: BCF 03.5
03D6: BCF 20.3
03D7: MOVF 20,W
03D8: BSF 03.5
03D9: MOVWF 07
03DA: MOVLW 01
03DB: BCF 03.5
03DC: MOVWF 14
03DD: MOVLW 00
03DE: BSF 03.5
03DF: MOVWF 14
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
03E0: MOVF 01,W
03E1: ANDLW C7
03E2: IORLW 08
03E3: MOVWF 01
.................... setup_timer_1(T1_DISABLED);
03E4: BCF 03.5
03E5: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
03E6: MOVLW 00
03E7: MOVWF 78
03E8: MOVWF 12
03E9: MOVLW 00
03EA: BSF 03.5
03EB: MOVWF 12
.................... setup_ccp1(CCP_OFF);
03EC: BCF 03.5
03ED: BSF 20.2
03EE: MOVF 20,W
03EF: BSF 03.5
03F0: MOVWF 07
03F1: BCF 03.5
03F2: CLRF 17
03F3: BSF 03.5
03F4: CLRF 1B
03F5: CLRF 1C
03F6: MOVLW 01
03F7: MOVWF 1D
.................... setup_comparator(NC_NC_NC_NC);
03F8: BCF 03.5
03F9: BSF 03.6
03FA: CLRF 07
03FB: CLRF 08
03FC: CLRF 09
....................
.................... setAK(); //nastaveni akcelerometru
03FD: BCF 03.6
03FE: GOTO 08B
....................
.................... printf("Akcelerometr IMU01A - MMA8451Q \r\n",);
03FF: MOVLW 04
0400: BSF 03.6
0401: MOVWF 0D
0402: MOVLW 00
0403: MOVWF 0F
0404: BCF 03.6
0405: CALL 0EA
.................... printf("(c) MLAB JACHO 2013 \r\n",);
0406: MOVLW 15
0407: BSF 03.6
0408: MOVWF 0D
0409: MOVLW 00
040A: MOVWF 0F
040B: BCF 03.6
040C: CALL 0EA
....................
.................... while(TRUE)
.................... {
.................... X=akX ();
040D: GOTO 282
040E: MOVF 79,W
040F: MOVWF 22
0410: MOVF 78,W
0411: MOVWF 21
.................... Y=akY ();
0412: GOTO 292
0413: MOVF 79,W
0414: MOVWF 24
0415: MOVF 78,W
0416: MOVWF 23
.................... Z=akZ ();
0417: GOTO 2A2
0418: MOVF 79,W
0419: MOVWF 26
041A: MOVF 78,W
041B: MOVWF 25
.................... printf("Namerene hodnoty: \r\n",);
041C: MOVLW 21
041D: BSF 03.6
041E: MOVWF 0D
041F: MOVLW 00
0420: MOVWF 0F
0421: BCF 03.6
0422: CALL 0EA
.................... printf("Osa X: %Ld \r\n",X);
0423: MOVLW 2C
0424: BSF 03.6
0425: MOVWF 0D
0426: MOVLW 00
0427: MOVWF 0F
0428: BCF 03.0
0429: MOVLW 07
042A: BCF 03.6
042B: MOVWF 27
042C: CALL 2B2
042D: MOVLW 10
042E: MOVWF 04
042F: MOVF 22,W
0430: MOVWF 28
0431: MOVF 21,W
0432: MOVWF 27
0433: CALL 301
0434: MOVLW 20
0435: MOVWF 30
0436: CALL 0C6
0437: MOVLW 0D
0438: MOVWF 30
0439: CALL 0C6
043A: MOVLW 0A
043B: MOVWF 30
043C: CALL 0C6
.................... printf("Osa Y: %Ld \r\n",Y);
043D: MOVLW 33
043E: BSF 03.6
043F: MOVWF 0D
0440: MOVLW 00
0441: MOVWF 0F
0442: BCF 03.0
0443: MOVLW 07
0444: BCF 03.6
0445: MOVWF 27
0446: CALL 2B2
0447: MOVLW 10
0448: MOVWF 04
0449: MOVF 24,W
044A: MOVWF 28
044B: MOVF 23,W
044C: MOVWF 27
044D: CALL 301
044E: MOVLW 20
044F: MOVWF 30
0450: CALL 0C6
0451: MOVLW 0D
0452: MOVWF 30
0453: CALL 0C6
0454: MOVLW 0A
0455: MOVWF 30
0456: CALL 0C6
.................... printf("Osa Z: %Ld \r\n",Z);
0457: MOVLW 3A
0458: BSF 03.6
0459: MOVWF 0D
045A: MOVLW 00
045B: MOVWF 0F
045C: BCF 03.0
045D: MOVLW 07
045E: BCF 03.6
045F: MOVWF 27
0460: CALL 2B2
0461: MOVLW 10
0462: MOVWF 04
0463: MOVF 26,W
0464: MOVWF 28
0465: MOVF 25,W
0466: MOVWF 27
0467: CALL 301
0468: MOVLW 20
0469: MOVWF 30
046A: CALL 0C6
046B: MOVLW 0D
046C: MOVWF 30
046D: CALL 0C6
046E: MOVLW 0A
046F: MOVWF 30
0470: CALL 0C6
.................... delay_ms (2000);
0471: MOVLW 08
0472: MOVWF 27
0473: MOVLW FA
0474: MOVWF 28
0475: GOTO 381
0476: DECFSZ 27,F
0477: GOTO 473
....................
.................... }
0478: GOTO 40D
.................... }
....................
0479: SLEEP
 
Configuration Fuses:
Word 1: 2CF5 INTRC NOWDT NOPUT MCLR NOPROTECT NOCPD NOBROWNOUT IESO FCMEN NOLVP NODEBUG
Word 2: 3FFF NOWRT BORV40
/Modules/Sensors/IMU01A/SW/PIC16F887/main.pjt
0,0 → 1,24
[PROJECT]
Target=D:\Honza\MLAB\Modules\Sensors\IMU01A\SW\PIC16F887\main.hex
Development_Mode=
Processor_Text=PIC16F887
ToolSuite=CCS
Processor=0x887F
[D:\Honza\MLAB\Modules\Sensors\IMU01A\SW\PIC16F887\main]
Type=4
Path=
FileList=
BuildTool=
OptionString=
AdditionalOptionString=
[mru-list]
1=D:\Honza\MLAB\Modules\Sensors\IMU01A\SW\PIC16F887\main.c
[Windows]
0=0000 %S 0 0 796 451 3 0
[Units]
Link=0
Count=1
1=D:\Honza\MLAB\Modules\Sensors\IMU01A\SW\PIC16F887\main
[Opened Files]
1=main.c
2=
/Modules/Sensors/IMU01A/SW/PIC16F887/main.sta
0,0 → 1,68
 
ROM used: 1146 (14%)
1146 (14%) including unused fragments
 
0 Average locations per line
4 Average locations per statement
 
RAM used: 13 (4%) at main() level
26 (7%) worst case
 
Stack used: 3 worst case (out of 8 total available)
 
Lines Stmts % Files
----- ----- --- -----
46 21 7 main.c
20 0 0 main.h
423 0 0 C:\Program Files (x86)\PICC\devices\16F887.h
2172 260 84 C:\Program Files (x86)\PICC\drivers\math.h
16 0 0 MMA8451Q.h
60 28 9 MMA8451Q.c
----- -----
2737 309 Total
 
Page ROM % RAM Vol Diff Functions:
---- --- --- --- --- ---- ----------
0 22 2 1 @delay_ms1
0 69 6 3 @I2C_READ_1
0 74 6 1 @I2C_WRITE_1
0 36 3 1 @PUTCHAR_1_
0 59 5 0 80 1.2 setAK
0 269 23 8 558 4.7 akR
Inline 6 272 5.5 @DIVS1616
0 16 1 2 68 2.4 akX
0 16 1 2 68 2.4 akY
0 16 1 2 68 2.4 akZ
0 227 20 1 584 3.3 MAIN
0 17 1 0 343 8.6 @const232
0 70 6 3 367 7.0 @PSTRINGC7_69
0 12 1 0 264 6.8 @const234
0 11 1 0 153 4.7 @const235
0 7 1 0 315 6.5 @const236
0 79 7 4 288 6.0 @PSTRINGCN7_69
0 128 11 9 209 5.2 @PRINTF_LD_69
0 7 1 0 346 7.5 @const241
0 7 1 0 318 6.5 @const242
 
Program metrics:
Functions 16
Statements 309
Comments 351
Volume (V) 7495
Difficilty (D) 80.2
Effort to implement (E) 600964
Time to implement (T) 9 hours, 16 minutes
Est Delivered Bugs (B) 2
Cyclomatic Complexity 25
Maintainability (MI) 132
 
Segment Used Free
----------- ---- ----
00000-00003 4 0
00004-007FF 1142 902
00800-00FFF 0 2048
01000-017FF 0 2048
01800-01FFF 0 2048
 
 
 
/Modules/Sensors/IMU01A/SW/PIC16F887/main.sym
0,0 → 1,119
004-005 @READ_PROGRAM_MEMORY8.P1
004 @WRITE_PROGRAM_MEMORY8.P2
015 CCP_1_LOW
015 CCP_1
016 CCP_1_HIGH
01B CCP_2_LOW
01B CCP_2
01C CCP_2_HIGH
020 @TRIS_C
021-022 x
023-024 y
025-026 z
027-028 akX.x
027 @PSTRINGCN7_69.P1
027-028 @PRINTF_LD_69.P2
027-028 akZ.z
027-028 akY.y
027 MAIN.@SCRATCH1
027 @PSTRINGC7_69.@SCRATCH1
028 @delay_ms1.P1
028 @PSTRINGC7_69.@SCRATCH2
028 @PSTRINGCN7_69.@SCRATCH1
029 akR.H
029 @PSTRINGC7_69.@SCRATCH3
029 @PSTRINGCN7_69.@SCRATCH2
029 @PRINTF_LD_69.@SCRATCH1
02A akR.l
02A @PSTRINGCN7_69.@SCRATCH3
02A @PRINTF_LD_69.@SCRATCH2
02B akR.XL
02B @PRINTF_LD_69.@SCRATCH3
02C akR.XH
02C @PRINTF_LD_69.@SCRATCH4
02D-02E akR.x
02D @PRINTF_LD_69.@SCRATCH5
02E @PRINTF_LD_69.@SCRATCH6
02F-030 @DIVS1616.P1
02F @I2C_READ_1.P2
02F @I2C_WRITE_1.P3
02F akR.@SCRATCH1
02F @PRINTF_LD_69.@SCRATCH7
030 @PUTCHAR_1_.P1
030 @I2C_READ_1.@SCRATCH1
030 akR.@SCRATCH2
031-032 @DIVS1616.P1
031 @I2C_READ_1.@SCRATCH2
033 @DIVS1616.@SCRATCH1
034 @DIVS1616.@SCRATCH2
077 @SCRATCH
078 @SCRATCH
078 _RETURN_
079 @SCRATCH
07A @SCRATCH
107.6 C1OUT
108.6 C2OUT
10D-10E @WRITE_PROGRAM_MEMORY8.P1
10D-10E @READ_PROGRAM_MEMORY8.P2
 
ROM Allocation:
0381 @delay_ms1
0130 @I2C_READ_1
0041 @I2C_WRITE_1
00C6 @PUTCHAR_1_
0800 @ADDFF
008B setAK
0175 akR
023C @DIVS1616
0282 akX
0292 akY
02A2 akZ
0397 MAIN
0004 @const232
00EA @PSTRINGC7_69
0015 @const234
0021 @const235
002C @const236
02B2 @PSTRINGCN7_69
0301 @PRINTF_LD_69
0033 @const241
003A @const242
0397 @cinit
 
 
User Memory space:
 
User Memory space:
 
Project Directory:
D:\Honza\MLAB\Modules\Sensors\IMU01A\SW\PIC16F887\
 
Project Files:
main.c
main.h
C:\Program Files (x86)\PICC\devices\16F887.h
C:\Program Files (x86)\PICC\drivers\math.h
MMA8451Q.h
MMA8451Q.c
 
Units:
D:\Honza\MLAB\Modules\Sensors\IMU01A\SW\PIC16F887\main (main)
 
Compiler Settings:
Processor: PIC16F887
Pointer Size: 16
ADC Range: 0-255
Opt Level: 9
Short,Int,Long: UNSIGNED: 1,8,16
Float,Double: 32,32
 
Output Files:
Errors: main.err
Ext Symbols: main.esym
INHX8: main.hex
Symbols: main.sym
List: main.lst
Debug/COFF: main.cof
Project: main.PJT
Call Tree: main.tre
Statistics: main.sta
/Modules/Sensors/IMU01A/SW/PIC16F887/main.tre
0,0 → 1,74
ÀÄmain
ÀÄMAIN 0/227 Ram=1
ÃÄ??0??
ÃÄsetAK 0/59 Ram=0
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÀÄ@I2C_WRITE_1 0/74 Ram=1
ÃÄ@PSTRINGC7_69 0/70 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/36 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PSTRINGC7_69 0/70 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/36 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄakX 0/16 Ram=2
³ ÀÄakR 0/269 Ram=8
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_READ_1 0/69 Ram=3
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_READ_1 0/69 Ram=3
³ ÀÄ@DIVS1616 (Inline) Ram=6
ÃÄakY 0/16 Ram=2
³ ÀÄakR 0/269 Ram=8
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_READ_1 0/69 Ram=3
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_READ_1 0/69 Ram=3
³ ÀÄ@DIVS1616 (Inline) Ram=6
ÃÄakZ 0/16 Ram=2
³ ÀÄakR 0/269 Ram=8
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_READ_1 0/69 Ram=3
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_WRITE_1 0/74 Ram=1
³ ÃÄ@I2C_READ_1 0/69 Ram=3
³ ÀÄ@DIVS1616 (Inline) Ram=6
ÃÄ@PSTRINGC7_69 0/70 Ram=3
³ ÃÄ@PUTCHAR_1_ 0/36 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PSTRINGCN7_69 0/79 Ram=4
³ ÃÄ@PUTCHAR_1_ 0/36 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PRINTF_LD_69 0/128 Ram=9
³ ÀÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PSTRINGCN7_69 0/79 Ram=4
³ ÃÄ@PUTCHAR_1_ 0/36 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PRINTF_LD_69 0/128 Ram=9
³ ÀÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PSTRINGCN7_69 0/79 Ram=4
³ ÃÄ@PUTCHAR_1_ 0/36 Ram=1
³ ÀÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PRINTF_LD_69 0/128 Ram=9
³ ÀÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PUTCHAR_1_ 0/36 Ram=1
ÃÄ@PUTCHAR_1_ 0/36 Ram=1
ÀÄ@delay_ms1 0/22 Ram=1