<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://shawnreeves.net//wiki/index.php?action=history&amp;feed=atom&amp;title=Magnetometer_PICAXE_20M2_program</id>
	<title>Magnetometer PICAXE 20M2 program - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://shawnreeves.net//wiki/index.php?action=history&amp;feed=atom&amp;title=Magnetometer_PICAXE_20M2_program"/>
	<link rel="alternate" type="text/html" href="https://shawnreeves.net//wiki/index.php?title=Magnetometer_PICAXE_20M2_program&amp;action=history"/>
	<updated>2026-09-20T02:38:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://shawnreeves.net//wiki/index.php?title=Magnetometer_PICAXE_20M2_program&amp;diff=2591&amp;oldid=prev</id>
		<title>Shawn: Created page with &quot;===PICAXE Program=== This program works with the circuit described in Magnetometer, when programmed on a [http://picaxe.com PICAXE] 20M2.  ;2014 Shawn Reeves  ;TEST RESULT...&quot;</title>
		<link rel="alternate" type="text/html" href="https://shawnreeves.net//wiki/index.php?title=Magnetometer_PICAXE_20M2_program&amp;diff=2591&amp;oldid=prev"/>
		<updated>2014-03-14T20:52:14Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;===PICAXE Program=== This program works with the circuit described in &lt;a href=&quot;/wiki/index.php?title=Magnetometer&quot; title=&quot;Magnetometer&quot;&gt;Magnetometer&lt;/a&gt;, when programmed on a [http://picaxe.com PICAXE] 20M2.  ;2014 Shawn Reeves  ;TEST RESULT...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;===PICAXE Program===&lt;br /&gt;
This program works with the circuit described in [[Magnetometer]], when programmed on a [http://picaxe.com PICAXE] 20M2.&lt;br /&gt;
 ;2014 Shawn Reeves&lt;br /&gt;
 ;TEST RESULTS:&lt;br /&gt;
 ; Power consumption:6mA at 5V, i.e. 30mW&lt;br /&gt;
 ; ADC readings:163 to 870, zero at 514&lt;br /&gt;
 ; Not absolutely linear—Use lookup table for accuracy.&lt;br /&gt;
 &lt;br /&gt;
 ;Power with a 5V DC supply. Use either USB, phone charger, or 9V battery via voltage regulator.&lt;br /&gt;
 #picaxe 20m2&lt;br /&gt;
 &lt;br /&gt;
 ;Choose which output(s) to use:&lt;br /&gt;
 #define useLCD&lt;br /&gt;
 #define useSerial&lt;br /&gt;
 &lt;br /&gt;
 symbol adcPin = C.7	;20M2 pin 3 to SS49 pin 3&lt;br /&gt;
 symbol dataOut = B.3 ;20M2 pin 15 to DOGM pin 28&lt;br /&gt;
 symbol SCK = B.2 ;20M2 pin 16 to DOGM pin 29&lt;br /&gt;
 symbol CSB = B.6 ;20M2 pin 12 to DOGM pin 38&lt;br /&gt;
 symbol RS = B.4 ;20M2 pin 14 to DOGM pin 39&lt;br /&gt;
 ;assign bit memory first&lt;br /&gt;
 symbol negabit = bit0	;all PICAXE maths are positive integers, so we use this bit to signify negative&lt;br /&gt;
 symbol overflowbit = bit1&lt;br /&gt;
 ;assign byte memory next, avoiding conflicts with above (divide above highest by 8, round down, add one)&lt;br /&gt;
 symbol ones = b1;these will hold ASCII values for each digit&lt;br /&gt;
 symbol tens = b2&lt;br /&gt;
 symbol hundreds = b3&lt;br /&gt;
 symbol thousands = b4&lt;br /&gt;
 symbol tenthousands = b5&lt;br /&gt;
 symbol counter = b6&lt;br /&gt;
 symbol byteOut = b7&lt;br /&gt;
 ;assign word memory next, avoiding conflicts with above (divide above highest by two, round down, add one)&lt;br /&gt;
 symbol reading = w4&lt;br /&gt;
 symbol Gauss = w5&lt;br /&gt;
 symbol clearCommand = 1&lt;br /&gt;
 symbol homeCommand = 2&lt;br /&gt;
 &lt;br /&gt;
 ;This routine should initialize the Electronic Assembly DOG-ME-081 8 character LCD display&lt;br /&gt;
 ;use symbol command to assign CSB, RS, dataOut, and SCK to out pins&lt;br /&gt;
 ;assign a byte variable to byteOut and shiftCounter&lt;br /&gt;
 initDOG:&lt;br /&gt;
 high CSB ;in case spurious signals were received during powerup&lt;br /&gt;
 low SCK;prepare clock to work on rise&lt;br /&gt;
 low CSB;select chip&lt;br /&gt;
 low RS;sending commands, not data&lt;br /&gt;
 ;The following lines from Electronic Assembly&amp;#039;s data sheet, with cursor mode altered.&lt;br /&gt;
 ;One might repeat the following command many times to get the attention of the ST7032 driver&lt;br /&gt;
 byteOut = %00110000 ;Function Set, 1 line, instruction table 0&lt;br /&gt;
 gosub shiftout_MSBFirst&lt;br /&gt;
 pauseus 27;recommended by ST7032 datasheet&lt;br /&gt;
 &lt;br /&gt;
 byteOut = %00110001 ;Function Set, 1 line, instruction table 1&lt;br /&gt;
 gosub shiftout_MSBFirst&lt;br /&gt;
 pauseus 27;recommended by ST7032 datasheet&lt;br /&gt;
 &lt;br /&gt;
 byteOut = %00110001 ;Function Set, 1 line, instruction table 1, repeat request recommended by ST7032 datasheet&lt;br /&gt;
 gosub shiftout_MSBFirst&lt;br /&gt;
 pauseus 27;recommended by ST7032 datasheet&lt;br /&gt;
 &lt;br /&gt;
 byteOut = %00011100 ;Bias 1/4, 1 line LCD&lt;br /&gt;
 gosub shiftout_MSBFirst&lt;br /&gt;
 pauseus 27;recommended by ST7032 datasheet&lt;br /&gt;
 &lt;br /&gt;
 byteOut = %01010001 ;Booster off, set contrast C5, C4&lt;br /&gt;
 gosub shiftout_MSBFirst&lt;br /&gt;
 pauseus 27;recommended by ST7032 datasheet&lt;br /&gt;
 &lt;br /&gt;
 byteOut = %01101010 ;set voltage follower on, gain 2/7&lt;br /&gt;
 gosub shiftout_MSBFirst&lt;br /&gt;
 pause 200;recommended by ST7032 datasheet&lt;br /&gt;
 &lt;br /&gt;
 byteOut = %01110100 ;set contrast C3, C2, C1&lt;br /&gt;
 gosub shiftout_MSBFirst&lt;br /&gt;
 pauseus 27;recommended by ST7032 datasheet&lt;br /&gt;
 &lt;br /&gt;
 byteOut = %00001100 ;display on, cursor off, blink cursor position&lt;br /&gt;
 gosub shiftout_MSBFirst&lt;br /&gt;
 pauseus 27;recommended by ST7032 datasheet&lt;br /&gt;
 &lt;br /&gt;
 byteOut = %00000001 ;clear display, home cursor&lt;br /&gt;
 gosub shiftout_MSBFirst&lt;br /&gt;
 pauseus 2&lt;br /&gt;
 &lt;br /&gt;
 byteOut = %00000110 ;entry from right to left (or opposite?), no scrolling.&lt;br /&gt;
 gosub shiftout_MSBFirst&lt;br /&gt;
 high RS;switch to data mode&lt;br /&gt;
 &lt;br /&gt;
 main:&lt;br /&gt;
 &lt;br /&gt;
 readHallSensor:&lt;br /&gt;
 readadc10 adcPin, reading 	;get a 10-bit ADC into a word&lt;br /&gt;
 &lt;br /&gt;
 convertToGauss:&lt;br /&gt;
 ;we have a number from 0 to 1023, representing voltage from 0 to 5V (or VCC)&lt;br /&gt;
 ;The SS49E Hall Sensor, at room temp, will output 0.8V at -1000 Gauss to 4V for 1000 Gauss, with zero at 2.5V&lt;br /&gt;
 ;We use a rough linear interpolation rather than a lookup table or polynomial curve&lt;br /&gt;
 ;According to measurements, the output goes from 163 to 871, a range we assume to represent -1000 to 1000 Gauss&lt;br /&gt;
 ;So, we multiply by the fraction 2000/708 to get Gauss from the adc reading.&lt;br /&gt;
 ;To make sure we don&amp;#039;t go over 65535, the limit on our 16 bit positive integer math, we reduce the fraction to 175/62:&lt;br /&gt;
 ;;Maximum reading = 354*175 = 61950 &amp;lt; 65535&lt;br /&gt;
 &lt;br /&gt;
 negabit=0&lt;br /&gt;
 overflowbit = 0&lt;br /&gt;
 if reading &amp;gt; 870 then&lt;br /&gt;
 	overflowbit = 1&lt;br /&gt;
 elseif reading &amp;gt; 516 then&lt;br /&gt;
 	reading = reading-516&lt;br /&gt;
 	Gauss=reading*175/62&lt;br /&gt;
 elseif reading = 516 then&lt;br /&gt;
 	Gauss = 0&lt;br /&gt;
 elseif reading &amp;gt; 163 then&lt;br /&gt;
 	reading = 516-reading&lt;br /&gt;
 	Gauss = reading*175/62&lt;br /&gt;
 	negabit = 1&lt;br /&gt;
 else&lt;br /&gt;
 	overflowbit = 1&lt;br /&gt;
 	negabit = 1&lt;br /&gt;
 endif&lt;br /&gt;
 displayDigits:&lt;br /&gt;
 &lt;br /&gt;
 #ifdef useSerial&lt;br /&gt;
 	if negabit = 1 then&lt;br /&gt;
 		sertxd (&amp;quot;-&amp;quot;)&lt;br /&gt;
 	endif&lt;br /&gt;
 	if overflowbit = 1 then&lt;br /&gt;
 		sertxd (&amp;quot;out of range&amp;quot;,13,10)&lt;br /&gt;
 	else&lt;br /&gt;
 		sertxd (#Gauss,&amp;quot; Gauss&amp;quot;,13,10)	;baud 4800 8N1&lt;br /&gt;
 	endif&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 #ifdef useLCD&lt;br /&gt;
 ;split the result into digits&lt;br /&gt;
 bintoascii Gauss, tenthousands, thousands, hundreds, tens, ones;Convert to digits and add 48 to each.&lt;br /&gt;
 ;We use an Electronic Assembly (Germany) DOGM081W-A, with 8 digits and an ST7036 controller capable of SPI comm.&lt;br /&gt;
 low RS	;for outputting command&lt;br /&gt;
 byteOut = clearCommand; alternatively set DRAM address to beginning of display. This may take too long:maybe we just go home and overwrite?&lt;br /&gt;
 gosub shiftout_MSBFirst&lt;br /&gt;
 pause 2	;clear takes between 1 and 2 ms to execute.&lt;br /&gt;
 high RS	;for outputting data&lt;br /&gt;
 if negabit = 1 then&lt;br /&gt;
 	byteOut =  %00101101	;code for negative sign&lt;br /&gt;
 	gosub shiftout_MSBFirst&lt;br /&gt;
 endif&lt;br /&gt;
 if overflowbit = 1 then&lt;br /&gt;
 	if negabit = 0 then&lt;br /&gt;
 		byteOut = &amp;quot;o&amp;quot;;ascii byte for &amp;#039;o&amp;#039;&lt;br /&gt;
 		gosub shiftout_MSBFirst&lt;br /&gt;
 		byteOut = &amp;quot;v&amp;quot;&lt;br /&gt;
 		gosub shiftout_MSBFirst&lt;br /&gt;
 		byteOut = &amp;quot;e&amp;quot;&lt;br /&gt;
 		gosub shiftout_MSBFirst&lt;br /&gt;
 		byteOut = &amp;quot;r&amp;quot;&lt;br /&gt;
 		gosub shiftout_MSBFirst&lt;br /&gt;
 	else&lt;br /&gt;
 		byteOut = &amp;quot;u&amp;quot;&lt;br /&gt;
 		gosub shiftout_MSBFirst&lt;br /&gt;
 		byteOut = &amp;quot;n&amp;quot;&lt;br /&gt;
 		gosub shiftout_MSBFirst&lt;br /&gt;
 		byteOut = &amp;quot;d&amp;quot;&lt;br /&gt;
 		gosub shiftout_MSBFirst&lt;br /&gt;
 		byteOut = &amp;quot;e&amp;quot;&lt;br /&gt;
 		gosub shiftout_MSBFirst&lt;br /&gt;
 		byteOut = &amp;quot;r&amp;quot;&lt;br /&gt;
 		gosub shiftout_MSBFirst&lt;br /&gt;
 	endif&lt;br /&gt;
 else&lt;br /&gt;
 	byteOut =  thousands&lt;br /&gt;
 	gosub shiftout_MSBFirst&lt;br /&gt;
 	byteOut =  hundreds&lt;br /&gt;
 	gosub shiftout_MSBFirst&lt;br /&gt;
 	byteOut =  tens&lt;br /&gt;
 	gosub shiftout_MSBFirst&lt;br /&gt;
 	byteOut =  ones&lt;br /&gt;
 	gosub shiftout_MSBFirst&lt;br /&gt;
 endif&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 pause 490	;wait half a second, minus a bit to account for display routine&lt;br /&gt;
 &lt;br /&gt;
 goto main	;do it all again&lt;br /&gt;
 &lt;br /&gt;
 shiftout_MSBFirst:&lt;br /&gt;
 for counter = 1 to 8&lt;br /&gt;
 	if byteOut &amp;gt; 127 then ;MSb must be 1&lt;br /&gt;
 		high dataOut&lt;br /&gt;
 	else&lt;br /&gt;
 		low dataOut&lt;br /&gt;
 	endif&lt;br /&gt;
 	;data must be set at least 10ns before clock rises. If overclocking, uncomment the following line:&lt;br /&gt;
 	;pauseus 1&lt;br /&gt;
 	high SCK&lt;br /&gt;
 	byteOut = byteOut * 2	;Shift the value so we mask the next bit&lt;br /&gt;
 	;data must remain set at least 150ns after clock rises.&lt;br /&gt;
 	pauseus 1	;wait 10 microseconds.&lt;br /&gt;
 	low SCK&lt;br /&gt;
 next counter&lt;br /&gt;
 return&lt;br /&gt;
&lt;br /&gt;
[[Category:Electronics]]&lt;/div&gt;</summary>
		<author><name>Shawn</name></author>
	</entry>
</feed>