Вот код программы void InitADC(void) { set_sleep_mode(SLEEP_MODE_ADC);//инициализировать енергосберегающий режим uart_puts("\r MCUCR="); uart_puti((int)MCUCR); SET_FRENCH();//устанавливает частоту 112КГц (частота кварца 14 318 180Гц (ADCRA|=_BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0))) ADCCR|=_BV(ADEN);//Выбрать одиночное преобразования ADMUX|=_BV(REFS0)|_BV(ADLAR);//результ преобразование выравнивается в левую сторону 8бит ADCCR|=_BV(ADIE);//разрешить прерывание по окончанию преобразования АЦП uart_puts("\r ADCCR="); uart_puti((int)ADCCR); uart_puts("\r ADMUX="); uart_puti((int)ADMUX); TCCR0|=_BV(CS01); TCNT0=0; ADCCR|=_BV(ADSC);//запустить АЦП sleep_mode();//перйти в енергосберегающий режим TCCR0=0; uart_puts("\r Timer="); uart_puti((int)TCNT0); } результат таков: MCUCR=16 (00010000b) ADCCR=143 (10001111b) ADMUX=96 (01100000b) Timer=5 вопрос: почему таймер =5, если должен быть равен 25(первое одиночное преобраз)*128(коеффициент деления АЦП)/8 mod(255)= 145 (прерываний от таймера нет), от чего может быть
и следующее вот функция //Функция получения температуры, параметр kan=номер канала unsigned int GetTemp(uint8_t kan) { volatile unsigned int Temp=0;//значение температуры возращаемое функцией ADMUX+=kan; TCCR0|=_BV(CS00); TCNT0=0; ADCCR|=_BV(ADSC);//запустить преобразование //sleep_mode();//ждать пока не закончиться TCCR0=0; Temp=(unsigned int)ADCH;//результат в регистр // _delay_us(1); uart_puts(" Timer="); uart_puti((int)TCNT0); uart_puts(" Temp="); uart_puti(Temp); uart_puts(" "); ADMUX&=~_BV(MUX0)&~_BV(MUX1)&~_BV(MUX2); return Temp+170;// прибавить начальные установки } SIGNAL(SIG_ADC) { ; }
вопрос следующего характера если раскоментировать sleep_mode() вообще эта функции не работает, от чего может возникать прерывание, в Proteus sleep вообще не работает, это его глюк или я что-то делаю не так
|