реклама на сайте
подробности

 
 
> АЦП и энергосберегающий режим, проверка работы
Slavik_tz
сообщение Jul 10 2009, 08:33
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558



Вот код программы
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 вообще не работает, это его глюк или я что-то делаю не так
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Slavik_tz
сообщение Jul 10 2009, 11:17
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558



если закоментровать //set_sleep_mode(SLEEP_MODE_ADC);//инициализировать енергосберегающий режим
то получится Idle (по умолчанию), и все начинает работать так как надо, просмотрев ассемблерный код то биты устанавливаються правельно, в чем траблы.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 17 2009, 02:01
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Slavik_tz @ Jul 10 2009, 14:17) *
просмотрев ассемблерный код то биты устанавливаються правельно, в чем траблы.

потому что протеус - правЕльный инструмент.
Если пользовать правЕльные инструменты, нарушать правЕла правопЕсания - пЕсать "правЕльно" и "пробЫвать", вместо того чтобы
1. читать документацию,
2. думать,
3. работать с железом,
4. писать на русском без ошибок,
то будет еще больше вопросов и, очевидно, "правЕльных".

PS: сорри наболело, от таких ошибок как "правельно и пробывал" уже в глазах рябит, а от протеуса - и проблем с ним просто тошнит.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st July 2025 - 03:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.02007 секунд с 7
ELECTRONIX ©2004-2016