anonymous wrote on Sunday, November 15, 2009:
Hello,
I have strange problems with those four. I have my PWM on timer3, when I initialize it all readings queued by ADC reading functions go wrong. My PWM initialization:
void initPwm (){
TCNT3 = 0;
OCR3A = 0;
OCR3B = 0;
TCCR3A = _BV(COM3A1)| _BV(COM3B1)| _BV(WGM31)|_BV(WGM30);
TCCR3B = _BV(CS30);
}
Next one of my ADC readings tasks(chanell 0):
void ADC0(void* pvParameters)
{
uint8_t odczyt;
while(1){
//ADC0 - czujnik - 0
ADMUX &= ~(_BV(MUX4) |_BV(MUX3) |_BV(MUX2) |_BV(MUX1) |_BV(MUX0));
ADCSRA |= _BV(ADSC);
while(bit_is_set(ADCSRA,ADSC)){};
odczyt = ADCH;
xQueueSendToBack(xQueue0, &odczyt, 0);
}
}
And ADC initialization:
void initAdc (){
ADCSRA=_BV(ADEN)| _BV(ADSC)| _BV(ADPS0) | _BV(ADPS1)| _BV(ADPS2);
ADMUX &= ~_BV(REFS1);
ADMUX |= _BV(REFS0);
ADMUX |= _BV(ADLAR);
}
Task creation:
xTaskCreate(ADC0, “ADC0”, configMINIMAL_STACK_SIZE, NULL, mainADC_TASK_PRIOTITY, NULL );
xTaskCreate(vLCDTask, “LCD”, configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL );
And so on… Lcd task try to read and if, show on LCD. Problem is that if I initPwm() there are problems - for example form 2 ADC channels I get simmilar readings, and when I changes value ewerything stops… Hard to say whats going on because its totally random! The code without FreeRTOS works perfectly, but I must use this RTOS…
Please help me, I spent few weaks on it ant can’t manage to figure it out. I can post somewhere full code if somebody wants to help me.
Thanks in advance.