WOW! I really got that interpretation wrong didn't I?
OK, I think I understand what you're doing.
I'll play with that a bit and see what happens.
Thanks for explaining.
<br>
WOW! I really got that interpretation wrong didn't I?
OK, I think I understand what you're doing.
I'll play with that a bit and see what happens.
Thanks for explaining.
<br>
DT
I'm thinking you might have a winner there Bill.
But I have a question or two.
I've had another go at your code and am getting some promising results.
It's hard to follow with a calculator, so I made an interface to help test the routines.
Also, instead of reading/writing to EEPROM, I've modified your routine to use an array, so that I can pass it data from the PC.
The array is a circular buffer that overwrites the oldest value with the new sample, and on each iteration runs your code to average all 16 samples in the array.
I'm thinking that the circular buffer might be a problem.
Maybe if it only took 16 samples then averaged ???
The modified routine looks like this ...The interface simply sends the Wind Vane readings to the PIC where it runs both of our averaging codes, and sends the results back for display.Code:X VAR BYTE ' First vector Y VAR BYTE ' Second vector Difference VAR BYTE ' Difference between vectors, always + Average VAR WORD ' Average of two vectors J VAR BYTE ' EEPROM memory address BillsData VAR BYTE[32] DataPos VAR BYTE Bill_Avg: DataPos = DataPos + 1 IF DataPos = 16 THEN DataPos = 0 BillsData(DataPos) = DIR ;DATA 250,230,240,34,200,10,10,23,23,21,125,0,34,255,123 ' 16 vectors FOR J = 0 TO 28 STEP 2 ' Read pairs of vectors ; READ J, X X = BillsData(J) ; READ J+1,Y Y = BillsData(J+1) if Y>X THEN SWAP X,Y ' X is always the larger variable Difference = X-Y Average = (Difference/2) + Y' Half difference and add to smaller vector IF Difference>128 then Average=Average+128 ' Reverse direction of vector IF Average>255 THEN Average=Average-255 ' Whole revolution? Subtract 255 if necessary ENDIF ; WRITE J/2 + 16,Average BillsData(J/2 + 16) = Average NEXT J Bill_Value = Average ; LCDOUT $fe,$80,"Average: ",DEC3 Average RETURN
Yours is on the right. Any thoughts on the sample buffer?
It works great unless there are large fast changes. (click image to play)
<object id='stUkhdQ01IR11XRFVbWlleU19R' width='711' height='444' type='application/x-shockwave-flash' data='http://www.screentoaster.com/swf/STPlayer.swf' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0'><param name='movie' value='http://www.screentoaster.com/swf/STPlayer.swf'/><param name='allowFullScreen' value='true'/><param name='allowScriptAccess' value='always'/><param name='flashvars' value='video=stUkhdQ01IR11XRFVbWlleU19R'/></object>
Sorry Internet Explorer only.![]()
DT
Darrel,
Thanks again for your investigation. The display 'InstruMental' is really good.
I guess the issue of:
1. Adding one new vector and then running the 'Averaging Tree' with 15 older vectors. Or...
2. Waiting till 16 new vectors are available and then running the 'Averaging Tree'
Is one of latency. And the selection should be based on:
1. The importance of immediate results.
2. The time interval between the availability of new vectors.
3. The need for the MCU to do other things.
I have attached some code that I used to send the averages to my PC with the screen presentation laid out so one can easily see, and check, the averages. The vectors come from a RANDOM function that loads up the PIC EEPROM. RS232 at 19,200 Baud on pin C.6. Loops continuosely.
Two questions for you please:
1. How does one post PBP code here so that it looks neat/tidy. My code looks OK on my PC but when I post it here it is a mess?
2. Is your 'InstruMental' writtern in Visual Basic? I want to learn this and recently got the book 'VISUAL BASIC FOR ELECTRONICS ENGINEERING APPLICATIONS' by Vincent Himpe. For me (An ex-electronics engineer) it's no good - starts off too advanced. Any advice on a good 'entry level' book?
Regards Bill Legge
Code:' -----[ Title ]------------------------------------------------- ' ' File...... WVL 877 VERTOR AVERAGE ' Purpose... Experiment with PIC16F877A ' Date...... July 2009 ' ' -----[ Program Description ]--------------------------- ' ' 1. Devices used: PIC16F877A on EasyPIC5 ' ' ----[ Includes / Defines ]----------------------------------------- ' define OSC 20 ' Define Xtal as 20 MHz. Use "HS" for programming ' include "modedefs.bas" ' Include serout defines ' ' -----[ Initialization ]-------------------------------------------- ' ADCON1 = %00001110 ' A0 is analog, remainder digital CMCON = %00000111 ' Comparators OFF INTCON = $80 ' Turns off interrupts. See PBP page 187 TRISA = %00000001 ' A0 is A/D input TRISB=0 : TRISC=0 : TRISD=0 : TRISE=0 PORTA=0 : PORTB=0 : PORTC=0 : PORTD=0 : PORTE=0 ' ' ----[ Variables ]-------------------------------------------------- ' X VAR BYTE ' First vector READ Y VAR byte ' Second vector READ Vector var byte[31] ' Stores 16 A/D readings of wind direction and averages Difference var byte ' Difference between vectors, always + Average var word ' Average of two vectors J var byte ' EEPROM memory address K var word Memory var byte ' Contents of EEPROM address J TxPin var PORTC.6 Heartbeat var PORTC.0 ' '-----[ Main ]------------------------------------------------------- ' Main: for J = 0 to 15 ' Create 16 random numbers 1 to 255 random K write J, K.lowbyte ' Load EEPROM with random numbers next J for J = 0 to 28 step 2 ' Read pairs of vectors read J, X read J+1,Y if Y>X then swap X,Y ' X is always the larger variable Difference = X-Y Average = (Difference/2) + Y ' Half difference and add to smaller vector IF DIFFERENCE>128 then Average=Average+128 ' Reverse direction of vector if Average>255 then Average=Average-255 ' Whole revolution? Subtract 255 if necessary endif write J/2 + 16,Average next J for J = 0 to 30 ' Send to PC at 19,200 Baud read J, Vector[J] next J serout2 TxPin,32,["VECTOR ADDITION",13,13] serout2 TxPin,32,[dec3 Vector[0],9,dec3 Vector[16],9,dec3 Vector[24],9,dec3 Vector[28],9,dec3 Vector[30],13] serout2 TxPin,32,[dec3 Vector[1],13] serout2 TxPin,32,[dec3 Vector[2],9,dec3 Vector[17],13] serout2 TxPin,32,[dec3 Vector[3],13] serout2 TxPin,32,[dec3 Vector[4],9,dec3 Vector[18],9,dec3 Vector[25],13] serout2 TxPin,32,[dec3 Vector[5],13] serout2 TxPin,32,[dec3 Vector[6],9,dec3 Vector[19],13] serout2 TxPin,32,[dec3 Vector[7],13] serout2 TxPin,32,[dec3 Vector[8],9,dec3 Vector[20],9,dec3 Vector[26],9,dec3 Vector[29],13] serout2 TxPin,32,[dec3 Vector[9],13] serout2 TxPin,32,[dec3 Vector[10],9,dec3 Vector[21],13] serout2 TxPin,32,[dec3 Vector[11],13] serout2 TxPin,32,[dec3 Vector[12],9,dec3 Vector[22],9,dec3 Vector[27],13] serout2 TxPin,32,[dec3 Vector[13],13] serout2 TxPin,32,[dec3 Vector[14],9,dec3 Vector[23],13] serout2 TxPin,32,[dec3 Vector[15],13,13,13] goto Main END
Very nice animated simulation by DT. What program are you using to create this?
Now, in DT's posted program taking an average with "S=(S*(AvgCount-1)+Temp)/AvgCount" takes some time to converge. With sudden changes in wind direction, which is usually the case, a high sampling rate is needed to keep up with this algorithm. This is a common issue when averaging several readings.
Robert
Bill,
After more testing, I can say that the problem I was seeing was due to my averaging the circular buffer after each sample.
By taking 16 samples (at high speed) then averaging, the vane can never go more than 128 unless it's crossing zero and everything works fine. If the samples are slow enough that the vane can go more than 128, the problem shows up again.
I'm sticking with SIN/COS/ATN.<hr>
The program I'm using is DT_InstruMental. Something I've been working on for awhile that makes it easy to display info from the PIC graphically.
It's still in it's infancy, but the only way to figure out what I need to do with it, is to use it. ... So I'm using it.
Here's one of my favorites so far ...
<object id='stUkhdQ01IR11XRl9VWV1aVF5T' width='345' height='308' type='application/x-shockwave-flash' data='http://www.screentoaster.com/swf/STPlayer.swf' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0'><param name='movie' value='http://www.screentoaster.com/swf/STPlayer.swf'/><param name='allowFullScreen' value='true'/><param name='allowScriptAccess' value='always'/><param name='flashvars' value='video=stUkhdQ01IR11XRl9VWV1aVF5T'/></object>
DT
NO! You can't have my KEG of beer.
Oh, you meant the program ...
I hope that everyone will have it someday, some kind of shareware/crippleware/demo, don't know yet.
But right now, you would hate me for the grief you would endure.
It really needs to be more user friendly, which is why I'm trying to use it as much as possible, so I can figure out the best way to go.
Before anyone gets it .. It must BE a dream, not a nighmare.
<br>
DT
Bookmarks