uint16_t hardware_analogRead(uint8_t ch)
{
    uint32_t buf = 0;

    // Initialize the ADC driver before first use
    ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_32);

    // Must setup the ADC channel to read beforehand
    if(ch < 15) 
        ADC_SetupChannel(ch);
    
    if(ch > 7) 
        ch = (1 << 8 | ((ch - 8) << MUX0));
    else 
        ch = ch << MUX0;

    // Perform a single conversion of the ADC channel 1
//  buf = ADC_GetChannelReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ch);

    // Start reading ADC channel 1 in free running (continuous conversion) mode
    ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ch);
    
    for(uint8_t i = 0; i < ADC_READINGS; i++)
    {
        while (!(ADC_IsReadingComplete()));
        
        buf += ADC_GetResult();
    }

    // Leave ADC Disabled to save power
    ADC_Disable();

    return (uint16_t)(buf / ADC_READINGS);
}
Beispiel #2
0
/** ISR to handle the reloading of the PWM timer with the next sample. */
ISR(TIMER0_COMPA_vect, ISR_BLOCK)
{
	uint8_t PrevPipe = Pipe_GetCurrentPipe();

	/* Check that the USB bus is ready for the next sample to write */
	if (Audio_Host_IsReadyForNextSample(&Speaker_Audio_Interface))
	{
		int16_t AudioSample;

		#if defined(USE_TEST_TONE)
			static uint8_t SquareWaveSampleCount;
			static int16_t CurrentWaveValue;
			
			/* In test tone mode, generate a square wave at 1/256 of the sample rate */
			if (SquareWaveSampleCount++ == 0xFF)
			  CurrentWaveValue ^= 0x8000;
			
			/* Only generate audio if the board button is being pressed */
			AudioSample = (Buttons_GetStatus() & BUTTONS_BUTTON1) ? CurrentWaveValue : 0;
		#else
			/* Audio sample is ADC value scaled to fit the entire range */
			AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult());

			#if defined(MICROPHONE_BIASED_TO_HALF_RAIL)
			/* Microphone is biased to half rail voltage, subtract the bias from the sample value */
			AudioSample -= (SAMPLE_MAX_RANGE / 2);
			#endif
		#endif
		
		Audio_Host_WriteSample16(&Speaker_Audio_Interface, AudioSample);	
		Audio_Host_WriteSample16(&Speaker_Audio_Interface, AudioSample);
	}
	
	Pipe_SelectPipe(PrevPipe);
}
/** Updates any parameter values that are sourced from hardware rather than explicitly set by the host, such as
 *  VTARGET levels from the ADC on supported AVR models.
 */
void V2Params_UpdateParamValues(void)
{
	#if defined(ADC)
	/* Update VTARGET parameter with the latest ADC conversion of VTARGET on supported AVR models */
	V2Params_GetParamFromTable(PARAM_VTARGET)->ParamValue = ((5 * 10 * ADC_GetResult()) / 1024);
	#endif
}
/** ISR to handle the reloading of the endpoint with the next sample. */
ISR(TIMER0_COMPA_vect, ISR_BLOCK)
{
	uint8_t PrevPipe = Pipe_GetCurrentPipe();

	Pipe_SelectPipe(AUDIO_DATA_OUT_PIPE);
	Pipe_Unfreeze();

	/* Check if the current pipe can be written to (device ready for more data) */
	if (Pipe_IsOUTReady())
	{
		int16_t AudioSample;

		#if defined(USE_TEST_TONE)
			static uint8_t SquareWaveSampleCount;
			static int16_t CurrentWaveValue;

			/* In test tone mode, generate a square wave at 1/256 of the sample rate */
			if (SquareWaveSampleCount++ == 0xFF)
			  CurrentWaveValue ^= 0x8000;

			/* Only generate audio if the board button is being pressed */
			AudioSample = (Buttons_GetStatus() & BUTTONS_BUTTON1) ? CurrentWaveValue : 0;
		#else
			/* Audio sample is ADC value scaled to fit the entire range */
			AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult());

			#if defined(MICROPHONE_BIASED_TO_HALF_RAIL)
			/* Microphone is biased to half rail voltage, subtract the bias from the sample value */
			AudioSample -= (SAMPLE_MAX_RANGE / 2);
			#endif
		#endif

		Pipe_Write_16_LE(AudioSample);
		Pipe_Write_16_LE(AudioSample);

		if (!(Pipe_IsReadWriteAllowed()))
		  Pipe_ClearOUT();
	}

	Pipe_Freeze();
	Pipe_SelectPipe(PrevPipe);
}
Beispiel #5
0
/** Task to manage the Audio interface, reading in ADC samples from the microphone, and them to the host. */
void USB_Audio_Task(void)
{
	/* Device must be connected and configured for the task to run */
	if (USB_DeviceState != DEVICE_STATE_Configured)
	  return;

	/* Check to see if the streaming interface is selected, if not the host is not receiving audio */
	if (!(StreamingAudioInterfaceSelected))
	  return;

	/* Select the audio stream endpoint */
	Endpoint_SelectEndpoint(AUDIO_STREAM_EPNUM);
	
	/* Check if the current endpoint can be written to and that the next sample should be stored */
	if (Endpoint_IsINReady() && (TIFR0 & (1 << OCF0A)))
	{
		/* Clear the sample reload timer */
		TIFR0 |= (1 << OCF0A);

		/* Audio sample is ADC value scaled to fit the entire range */
		int16_t AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult());
		
		#if defined(MICROPHONE_BIASED_TO_HALF_RAIL)
		/* Microphone is biased to half rail voltage, subtract the bias from the sample value */
		AudioSample -= (SAMPLE_MAX_RANGE / 2);
		#endif

		/* Write the sample to the buffer */
		Endpoint_Write_Word_LE(AudioSample);

		/* Check to see if the bank is now full */
		if (!(Endpoint_IsReadWriteAllowed()))
		{
			/* Send the full packet to the host */
			Endpoint_ClearIN();
		}
	}
}
void SensorFastLoopControl(bool bOff)
{
    if (bOff)
    {
        if (!bMeasureFinished)
        {
            bSensorDisableLights = true;
            bMeasure = true;
        }
       
        if (bMeasure)
        {
            LocalCnt++;

            if (LocalCnt > SENSOR_SKIP_NUMBER)
            {           
                LocalSum += ADC_GetResult(ADC_LIGHT_SENS_CHANNEL);
                //LocalCnt++;
               
                if (LocalCnt >= (SENSOR_MEASURE_NUMBER+SENSOR_SKIP_NUMBER))
                {
                    // MeasureFinished
                    bSensorDataReady = true;
                    bMeasureFinished = true;
                    bMeasure         = false;
                    bSensorDisableLights = false;
                }
            }
        }
    }
    else
    {
        if (bMeasureFinished)
        {
            bMeasureFinished = false;
        }
    }
}
/** Updates any parameter values that are sourced from hardware rather than explicitly set by the host, such as
 *  VTARGET levels from the ADC on supported AVR models.
 */
void V2Params_UpdateParamValues(void)
{
	#if (defined(ADC) && !defined(NO_VTARGET_DETECT))
	/* Update VTARGET parameter with the latest ADC conversion of VTARGET on supported AVR models */
	V2Params_GetParamFromTable(PARAM_VTARGET)->ParamValue = (((uint16_t)(VTARGET_REF_VOLTS * 10 * VTARGET_SCALE_FACTOR) * ADC_GetResult()) / 1024);
	#endif
}
void SensorPreInitMeasure(void)
{
    int i;
    volatile int j;
    
    uint32 StartDeltaT;     // (CurTime - StartTime) sec
    uint32 LastDeltaT;      // (CurTime - LastTime) sec

    CurTime = Status.CurDateTime;

    LocalSum = 0;

    LastDeltaT = CalcTimeDelta(Status.CurDateTime.hour, Status.CurDateTime.min, Status.CurDateTime.sec,
                               SensorInfo.LastHour,     SensorInfo.LastMin,     SensorInfo.LastSec
                              );

    ForcedMeasureCount = LastDeltaT;
    
    if (LastDeltaT > NO_MEASURE_TIME)
    {
        StartDeltaT = CalcTimeDelta(Status.CurDateTime.hour, Status.CurDateTime.min, Status.CurDateTime.sec,
                                    SensorInfo.StartHour,    SensorInfo.StartMin,    SensorInfo.StartSec
                                   );
        LearnCount = StartDeltaT;

        if (ForcedMeasureCount > FORCED_LEARN_TIME)
        {
            SensorInfo.TotalSum = 0;
            SensorInfo.TotalCnt = 0;

            LocalSum   = 0;
            LocalCnt   = 0;
            LocalValue = 0;

            SensorInfo.SensorInvalid |= SENSOR_LEARN_FLAG;

            LearnCount = 0;
        }

        for (i=0; i<SENSOR_MEASURE_NUMBER; i++)
        {
            LocalSum += ADC_GetResult(ADC_LIGHT_SENS_CHANNEL);
            LocalCnt++;

            // Delay
            for (j=0;j<300;j++);
        }

        LocalValue = LocalSum/LocalCnt;
        LocalSum = 0;
        LocalCnt = 0;

        // LastTime = CurTime;
        SensorInfo.LastHour = Status.CurDateTime.hour;
        SensorInfo.LastMin  = Status.CurDateTime.min;
        SensorInfo.LastSec  = Status.CurDateTime.sec;
        
        ForcedMeasureCount = 0;
        
        if ( (LearnCount > ((uint32)Config2.SensorFilterTime*60)) && SensorInfo.TotalCnt )
        {
            SensorInfo.SensorValue = SensorInfo.TotalSum/SensorInfo.TotalCnt;

            SensorInfo.TotalSum = 0;
            SensorInfo.TotalCnt = 0;

            SensorInfo.SensorInvalid &= ~SENSOR_LEARN_FLAG;
        }

        if (!SensorInfo.TotalCnt)
        {
            // StartTime = CurTime;
            SensorInfo.StartHour = Status.CurDateTime.hour;
            SensorInfo.StartMin  = Status.CurDateTime.min;
            SensorInfo.StartSec  = Status.CurDateTime.sec;

            LearnCount = 0;
        }

        SensorInfo.TotalSum += LocalValue;
        SensorInfo.TotalCnt++;
    }
}
void ProcessLightSensor(void)
{
    SensorInfo.SensorValue += ADC_GetResult(ADC_LIGHT_SENS_CHANNEL);
    SensorInfo.SensorValue >>= 1;
}
Beispiel #10
0
void ButtonStates(void) {

  uint16_t port, result;
  char buffer[64];

  PORTD = 0b11111111;
  /*for (int i=0; i<4; i++) {
    if (i > 1) {
      PORTC = (i%1 == 0) ? 0b01000000 : 0b10000000;
    } else {
      PORTB = (i%1 == 0) ? 0b01000000 : 0b10000000;
    }
*/
    // TODO: dry this up
    ADC_StartReading(ADC_REFERENCE_AVCC | ADC_LEFT_ADJUSTED | ADC_CHANNEL0);
    while(!(ADC_IsReadingComplete())) {}
    sprintf(buffer, "4,%d\n", ADC_GetResult());
    fputs(buffer, &USBSerialStream);

    ADC_StartReading(ADC_REFERENCE_AVCC | ADC_LEFT_ADJUSTED | ADC_CHANNEL1);
    while(!(ADC_IsReadingComplete())) {}
    sprintf(buffer, "0,%d\n", ADC_GetResult());
    fputs(buffer, &USBSerialStream);

    ADC_StartReading(ADC_REFERENCE_AVCC | ADC_LEFT_ADJUSTED | ADC_CHANNEL4);
    while(!(ADC_IsReadingComplete())) {}
    sprintf(buffer, "1,%d\n", ADC_GetResult());
    fputs(buffer, &USBSerialStream);

    ADC_StartReading(ADC_REFERENCE_AVCC | ADC_LEFT_ADJUSTED | ADC_CHANNEL5);
    while(!(ADC_IsReadingComplete())) {}
    sprintf(buffer, "2,%d\n", ADC_GetResult());
    fputs(buffer, &USBSerialStream);

    ADC_StartReading(ADC_REFERENCE_AVCC | ADC_LEFT_ADJUSTED | ADC_CHANNEL6);
    while(!(ADC_IsReadingComplete())) {}
    sprintf(buffer, "3,%d\n", ADC_GetResult());
    fputs(buffer, &USBSerialStream);

    ADC_StartReading(ADC_REFERENCE_AVCC | ADC_LEFT_ADJUSTED | ADC_CHANNEL12);
    while(!(ADC_IsReadingComplete())) {}
    sprintf(buffer, "7,%d\n", ADC_GetResult());
    fputs(buffer, &USBSerialStream);

    ADC_StartReading(ADC_REFERENCE_AVCC | ADC_LEFT_ADJUSTED | ADC_CHANNEL13);
    while(!(ADC_IsReadingComplete())) {}
    sprintf(buffer, "6,%d\n", ADC_GetResult());
    fputs(buffer, &USBSerialStream);

    ADC_StartReading(ADC_REFERENCE_AVCC | ADC_LEFT_ADJUSTED | ADC_CHANNEL7);
    while(!(ADC_IsReadingComplete())) {}
    sprintf(buffer, "5,%d\n", ADC_GetResult());
    fputs(buffer, &USBSerialStream);

/*
    ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ADC_CHANNEL5);
    while(!(ADC_IsReadingComplete())) {}
    sprintf(buffer, "  %d", ADC_GetResult());
    fputs(buffer, &USBSerialStream);

    ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ADC_CHANNEL6);
    while(!(ADC_IsReadingComplete())) {}
    sprintf(buffer, "  %d", ADC_GetResult());
    fputs(buffer, &USBSerialStream);

    ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ADC_CHANNEL7);
    while(!(ADC_IsReadingComplete())) {}
    sprintf(buffer, "  %d", ADC_GetResult());
    fputs(buffer, &USBSerialStream);


    PORTB = 0;
    PORTC = 0;
  //}
  */
}
Beispiel #11
0
bool TestRG_ShowLowVolt(bool bInit)
{
    static int Test_ShowLV_State;
    static uint16 Voltage;
    
    if (bInit)
    {
        TestStatePrev = TestState;
        secCounter   = 0;
        TestCounter  = 0;
        Test_sec     = 0;

        Test_DigG    = -1;
        Test_DigR    = -1;

        DigMask      = 0;
        
        RedManVar    = 0;
        GreenManVar  = 0;
        GManPhase    = 0;

        Test_ShowLV_State = 0;
    }
    
    secCounter++;
    
    switch (Test_ShowLV_State)
    {
        case 0:
        {
            if (secCounter>=TEST_MEASURE_LV_TIME)
            {
                Voltage = ADC_GetResult(ADC_POWER_FB_CHANNEL);

                Test_DigG = (VOLTAGE_SCALE * (uint32)Voltage) >> 16;
                DigMask   = CalcNumberMask(Test_DigG, GREEN_MAX_COUNT);

                RedManVar    = 0;
                GreenManVar  = GMAN0_MASK|GMAN1_MASK;
                GManPhase    = 0;

                secCounter = 0;

                Test_ShowLV_State = 1;
            }

            break;
        };

        case 1:
        {
            if (secCounter>=TEST_SHOW_LV_TIME)
            {
                //DigMask      = 0;
                
                //RedManVar    = RMAN_MASK;
                //GreenManVar  = 0;
                //GManPhase    = 0;
                
                secCounter = 0;
                //Test_ShowLV_State = 2;
                return true;
            }

            break;
        };
                        
        //case 2:
        //{
        //    if (secCounter>=TEST_RED_PAUSE_TIME)
        //    {
        //        secCounter = 0;
        //        return true;
        //    }
        //
        //    break;
        //};

        default:
        {
            Test_ShowLV_State = 0;
            break;
        }
    }