arduino-0022
This commit is contained in:
		
							parent
							
								
									4f99742f03
								
							
						
					
					
						commit
						a9ad0e80a0
					
				
					 803 changed files with 69785 additions and 33024 deletions
				
			
		| 
						 | 
				
			
			@ -0,0 +1,250 @@
 | 
			
		|||
//************************************************************************
 | 
			
		||||
//*	Arduino Test Suite
 | 
			
		||||
//*	ATS_ToneTest
 | 
			
		||||
//*	
 | 
			
		||||
//*	Copyright (c) 2010 Mark Sproul  All right reserved.
 | 
			
		||||
//*	 
 | 
			
		||||
//*	This library is free software; you can redistribute it and/or
 | 
			
		||||
//*	modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
//*	License as published by the Free Software Foundation; either
 | 
			
		||||
//*	version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
//*	
 | 
			
		||||
//*	This library 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
 | 
			
		||||
//*	Lesser General Public License for more details.
 | 
			
		||||
//*	
 | 
			
		||||
//*	You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
//*	License along with this library; if not, write to the Free Software
 | 
			
		||||
//*	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
//************************************************************************
 | 
			
		||||
//*	Aug 31,	2010	<MLS> Started on TestArduino
 | 
			
		||||
//*	Oct 23,	2010	<MLS> Started on ToneTest
 | 
			
		||||
//************************************************************************
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include	"WProgram.h"
 | 
			
		||||
#include	"HardwareSerial.h"
 | 
			
		||||
 | 
			
		||||
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
 | 
			
		||||
	#define	kBoard_PinCount		20
 | 
			
		||||
	#define	kBoard_AnalogCount	6
 | 
			
		||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
 | 
			
		||||
	#define	kBoard_PinCount		70
 | 
			
		||||
	#define	kBoard_AnalogCount	16
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include	<ArduinoTestSuite.h>
 | 
			
		||||
 | 
			
		||||
//************************************************************************
 | 
			
		||||
void	TestTonePin(uint8_t toneOutputPinNumber)
 | 
			
		||||
{
 | 
			
		||||
uint8_t 		helperpin;
 | 
			
		||||
unsigned long	startMilliSecs;
 | 
			
		||||
unsigned long	highCount, lowCount;
 | 
			
		||||
int				previousState;
 | 
			
		||||
int				currentState;
 | 
			
		||||
char			testNameString[80];
 | 
			
		||||
long			outputFreq;
 | 
			
		||||
long			measuredFreq;
 | 
			
		||||
boolean			passed;
 | 
			
		||||
long			percentError;
 | 
			
		||||
long			deltaFreq;
 | 
			
		||||
 | 
			
		||||
	if ((toneOutputPinNumber % 2) == 0)
 | 
			
		||||
	{
 | 
			
		||||
		//*	if its EVEN, add 1
 | 
			
		||||
		helperpin	=	toneOutputPinNumber + 1;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		//*	if its ODD
 | 
			
		||||
		helperpin	=	toneOutputPinNumber - 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//*	dont set the mode of the OUTPUT pin, the tone command does that
 | 
			
		||||
	
 | 
			
		||||
	pinMode(helperpin, INPUT);
 | 
			
		||||
	
 | 
			
		||||
	previousState	=	digitalRead(helperpin);
 | 
			
		||||
	startMilliSecs	=	millis();
 | 
			
		||||
	highCount		=	0;
 | 
			
		||||
	lowCount		=	0;
 | 
			
		||||
	measuredFreq	=	0;
 | 
			
		||||
	//*	we are going to watch for one second
 | 
			
		||||
	outputFreq	=	random(200, 2000);
 | 
			
		||||
	
 | 
			
		||||
	tone(toneOutputPinNumber, outputFreq);
 | 
			
		||||
	while ((millis() - startMilliSecs) < 1000)
 | 
			
		||||
	{
 | 
			
		||||
		currentState	=	digitalRead(helperpin);
 | 
			
		||||
		if (currentState == HIGH)
 | 
			
		||||
		{
 | 
			
		||||
			highCount++;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			lowCount++;
 | 
			
		||||
		}
 | 
			
		||||
		//*	check to see if it changed state
 | 
			
		||||
		if ((currentState == HIGH) && (previousState == LOW))
 | 
			
		||||
		{
 | 
			
		||||
			measuredFreq++;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		previousState	=	currentState;
 | 
			
		||||
	}
 | 
			
		||||
	noTone(toneOutputPinNumber);
 | 
			
		||||
	
 | 
			
		||||
	deltaFreq		=	abs(measuredFreq - outputFreq);
 | 
			
		||||
	
 | 
			
		||||
	percentError	=	100 - abs(((outputFreq - deltaFreq) * 100) / outputFreq);
 | 
			
		||||
	
 | 
			
		||||
	sprintf(testNameString, "ToneTest.%02d (out freq= %4ld measured freq= %4ld err= %ld%%)", toneOutputPinNumber, outputFreq, measuredFreq, percentError);
 | 
			
		||||
	if (percentError < 5)
 | 
			
		||||
	{
 | 
			
		||||
		passed	=	true;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		passed	=	false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ATS_PrintTestStatus(testNameString, passed);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//************************************************************************
 | 
			
		||||
//*	this test to make sure the duration option works
 | 
			
		||||
void	TestToneDuration(uint8_t toneOutputPinNumber)
 | 
			
		||||
{
 | 
			
		||||
uint8_t 		helperpin;
 | 
			
		||||
unsigned long	startMilliSecs;
 | 
			
		||||
unsigned long	highCount, lowCount;
 | 
			
		||||
int				previousState;
 | 
			
		||||
int				currentState;
 | 
			
		||||
char			testNameString[80];
 | 
			
		||||
long			outputFreq;
 | 
			
		||||
long			measuredFreq;
 | 
			
		||||
boolean			passed;
 | 
			
		||||
long			percentError;
 | 
			
		||||
long			deltaFreq;
 | 
			
		||||
long			durationTime;
 | 
			
		||||
 | 
			
		||||
	if ((toneOutputPinNumber % 2) == 0)
 | 
			
		||||
	{
 | 
			
		||||
		//*	if its EVEN, add 1
 | 
			
		||||
		helperpin	=	toneOutputPinNumber + 1;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		//*	if its ODD
 | 
			
		||||
		helperpin	=	toneOutputPinNumber - 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//*	dont set the mode of the OUTPUT pin, the tone command does that
 | 
			
		||||
	
 | 
			
		||||
	pinMode(helperpin, INPUT);
 | 
			
		||||
	
 | 
			
		||||
	previousState	=	digitalRead(helperpin);
 | 
			
		||||
	startMilliSecs	=	millis();
 | 
			
		||||
	highCount		=	0;
 | 
			
		||||
	lowCount		=	0;
 | 
			
		||||
	measuredFreq	=	0;
 | 
			
		||||
	durationTime	=	0;
 | 
			
		||||
	//*	we are going to watch for one second
 | 
			
		||||
	outputFreq	=	random(500, 2000);
 | 
			
		||||
	
 | 
			
		||||
	tone(toneOutputPinNumber, outputFreq, 1000);
 | 
			
		||||
	while ((millis() - startMilliSecs) < 2000)
 | 
			
		||||
	{
 | 
			
		||||
		currentState	=	digitalRead(helperpin);
 | 
			
		||||
		if (currentState == HIGH)
 | 
			
		||||
		{
 | 
			
		||||
			highCount++;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			lowCount++;
 | 
			
		||||
		}
 | 
			
		||||
		//*	count the freq
 | 
			
		||||
		if ((currentState == HIGH) && (previousState == LOW))
 | 
			
		||||
		{
 | 
			
		||||
			measuredFreq++;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		//*	check to see if it changed state
 | 
			
		||||
		if (currentState != previousState)
 | 
			
		||||
		{
 | 
			
		||||
			durationTime	=	millis() - startMilliSecs;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		previousState	=	currentState;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	deltaFreq		=	abs(measuredFreq - outputFreq);
 | 
			
		||||
	
 | 
			
		||||
	percentError	=	100 - abs(((outputFreq - deltaFreq) * 100) / outputFreq);
 | 
			
		||||
	
 | 
			
		||||
	sprintf(testNameString, "ToneTesDurationt.%02d (durationTime =%4ld/1000 freq err= %ld%%)", toneOutputPinNumber, durationTime, percentError);
 | 
			
		||||
	if ((durationTime > 990) && (durationTime < 1010) &&  (percentError < 5))
 | 
			
		||||
	{
 | 
			
		||||
		passed	=	true;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		passed	=	false;
 | 
			
		||||
	}
 | 
			
		||||
	noTone(toneOutputPinNumber);
 | 
			
		||||
 | 
			
		||||
	ATS_PrintTestStatus(testNameString, passed);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//************************************************************************
 | 
			
		||||
void setup()
 | 
			
		||||
{
 | 
			
		||||
short	ii;
 | 
			
		||||
uint8_t	timerNumber;
 | 
			
		||||
int		startMemoryUsage;
 | 
			
		||||
 | 
			
		||||
	startMemoryUsage	=	ATS_GetFreeMemory();
 | 
			
		||||
 | 
			
		||||
	ATS_begin("Arduino", "ToneTest");
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	//*	we start at 2 because 0/1 are RXD/TXD
 | 
			
		||||
	for (ii=2; ii<kBoard_PinCount; ii++)
 | 
			
		||||
	{
 | 
			
		||||
		TestTonePin(ii);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	//*	we dont need to test every pin	
 | 
			
		||||
	for (ii=2; ii<kBoard_PinCount; ii += 5)
 | 
			
		||||
	{
 | 
			
		||||
		TestToneDuration(ii);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	ATS_ReportMemoryUsage(startMemoryUsage);
 | 
			
		||||
 | 
			
		||||
	ATS_end();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//************************************************************************
 | 
			
		||||
void loop()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in a new issue