Fixed several issues:
- ADC has now averaging - Pause screen added - Fixed display glitches for most parts git-svn-id: https://svn.vbchaos.nl/svn/hsb/trunk@258 05563f52-14a8-4384-a975-3d1654cca0fa
This commit is contained in:
@@ -43,7 +43,7 @@
|
||||
// Constant and macro definitions
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#define ADC_AVERAGE_DEPTH (10)
|
||||
#define ADC_NUMBER_OF_CHANNELS (18) // 16 IOs + Temp + Vcc
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -85,7 +85,7 @@ struct Adc
|
||||
ADC_TypeDef* ADCx;
|
||||
ADC_InitTypeDef ADC_InitStruct;
|
||||
bool useDMA;
|
||||
bool useRanks;
|
||||
int numberOfUsedChannels;
|
||||
struct AdcChannel channel[ADC_NUMBER_OF_CHANNELS];
|
||||
// Only necessary when the RANK parameter determines conversion order or RANK is used anyway
|
||||
// For single conversions the READ function simply returns the converted value
|
||||
@@ -93,7 +93,7 @@ struct Adc
|
||||
// When initialising an ADC channel to a regular group, the RANK parameter determines the
|
||||
// order of convertions. E.G. channel 5 can be put first while channel 1 can be put last.
|
||||
// The array index stands for the RANK
|
||||
uint16_t channelValue[ADC_NUMBER_OF_CHANNELS];
|
||||
uint16_t channelValue[ADC_NUMBER_OF_CHANNELS * ADC_AVERAGE_DEPTH];
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
|
||||
@@ -90,4 +90,7 @@ extern ErrorStatus RTC_construct(struct Rtc* self);
|
||||
extern struct Observable* RTC_getObservable(struct Rtc* self);
|
||||
|
||||
|
||||
extern void RTC_calculateTimeFromSeconds(uint32_t seconds, struct Time* time);
|
||||
|
||||
|
||||
#endif /* INC_RTC_H_ */
|
||||
|
||||
@@ -82,6 +82,7 @@ ErrorStatus ADC_construct(struct Adc* self, struct AdcParameters* parameters)
|
||||
self->channelValue[loopCounter] = 0;
|
||||
}
|
||||
self->initialized = true;
|
||||
self->numberOfUsedChannels = 0;
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
@@ -98,8 +99,8 @@ void ADC_destruct (struct Adc* self)
|
||||
|
||||
ADC_DeInit(self->ADCx);
|
||||
self->useDMA = false;
|
||||
self->useRanks = false;
|
||||
self->initialized = false;
|
||||
self->numberOfUsedChannels = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -169,7 +170,7 @@ ErrorStatus ADCChannel_construct(struct AdcChannel* self, struct Adc* parent, st
|
||||
{
|
||||
returnValue = ERROR;
|
||||
}
|
||||
if (parameters->channel < 18)
|
||||
if (parameters->channel < ADC_NUMBER_OF_CHANNELS)
|
||||
{
|
||||
self->channel = parameters->channel;
|
||||
}
|
||||
@@ -183,11 +184,12 @@ ErrorStatus ADCChannel_construct(struct AdcChannel* self, struct Adc* parent, st
|
||||
{
|
||||
parent->channel[self->channel] = *self;
|
||||
self->parent = parent;
|
||||
self->ADC_SampleTime = parameters->ADC_SampleTime;
|
||||
self->ADC_SampleTime = parameters->ADC_SampleTime;
|
||||
self->initialized = true;
|
||||
self->parent->numberOfUsedChannels++;
|
||||
|
||||
//TODO MAKE SURE EACH RANK IS USED ONLY ONCE
|
||||
ADC_RegularChannelConfig(self->parent->ADCx, self->channel, self->Rank, self->ADC_SampleTime);
|
||||
self->parent->useRanks = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -203,6 +205,7 @@ ErrorStatus ADCChannel_construct(struct AdcChannel* self, struct Adc* parent, st
|
||||
void ADCChannel_destruct(struct AdcChannel* self)
|
||||
{
|
||||
self->initialized = false;
|
||||
self->parent->numberOfUsedChannels--;
|
||||
}
|
||||
|
||||
|
||||
@@ -210,13 +213,16 @@ ErrorStatus ADCChannel_read(const struct AdcChannel* self, uint16_t* value)
|
||||
{
|
||||
ErrorStatus returnValue = SUCCESS;
|
||||
|
||||
// For reading it is important whether Ranks are enabled or not
|
||||
if (self->parent->useRanks)
|
||||
// Reading ADC value is automatically combined with an floating averaging
|
||||
uint32_t average = 0;
|
||||
int loopCounter;
|
||||
for (loopCounter = self->channel; loopCounter < self->parent->numberOfUsedChannels * ADC_AVERAGE_DEPTH; loopCounter = loopCounter + self->parent->numberOfUsedChannels)
|
||||
{
|
||||
// Rank starts with 1 - must be reduced by one in order tu be used as index
|
||||
// *value = self->parent->channelValue[self->Rank - 1];
|
||||
*value = self->parent->channelValue[self->channel];
|
||||
average = average + self->parent->channelValue[loopCounter];
|
||||
}
|
||||
*value = average / ADC_AVERAGE_DEPTH;
|
||||
|
||||
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
@@ -238,3 +244,4 @@ static ErrorStatus read(const struct IODevice* self, char* buffer, size_t length
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
|
||||
@@ -555,7 +555,7 @@ static ErrorStatus initPeriphery(void)
|
||||
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
|
||||
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)adc1->channelValue;
|
||||
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
|
||||
DMA_InitStructure.DMA_BufferSize = ADC1_NUMBER_OF_USED_CHANNELS;
|
||||
DMA_InitStructure.DMA_BufferSize = ADC_AVERAGE_DEPTH * ADC1_NUMBER_OF_USED_CHANNELS;
|
||||
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
||||
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
|
||||
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
|
||||
@@ -570,7 +570,7 @@ static ErrorStatus initPeriphery(void)
|
||||
/* --------------------------------------------------------------------*/
|
||||
/* ADC1 - for module feedback */
|
||||
/* --------------------------------------------------------------------*/
|
||||
IRQ_setInterruptProperties(ADC1_2_IRQn, 12, 12, DISABLE);
|
||||
IRQ_setInterruptProperties(ADC1_2_IRQn, 12, 12, ENABLE);
|
||||
adc1Parameters->ADC_Mode = ADC_Mode_Independent;
|
||||
adc1Parameters->ADC_ScanConvMode = ENABLE;
|
||||
adc1Parameters->ADC_ContinuousConvMode = ENABLE;
|
||||
|
||||
@@ -99,6 +99,23 @@ struct Observable* RTC_getObservable(struct Rtc* self)
|
||||
}
|
||||
|
||||
|
||||
void RTC_calculateTimeFromSeconds(uint32_t seconds, struct Time* time)
|
||||
{
|
||||
if (seconds > 0)
|
||||
{
|
||||
time->hours = (seconds / (60 * 60));
|
||||
time->minutes = (seconds - (time->hours * 60 * 60)) / 60;
|
||||
time->seconds = (seconds - (time->hours * 60 * 60) - (time->minutes * 60));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Prevent underflows
|
||||
time->hours = 0;
|
||||
time->minutes = 0;
|
||||
time->seconds = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void RTC_IRQHandler(void)
|
||||
{
|
||||
static signed portBASE_TYPE higherPriorityTaskWoken = pdFALSE;
|
||||
|
||||
Reference in New Issue
Block a user