Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
04.11.2010, 06:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Помогите с регистрами АЦП ATMega8535
Доброе время всем.
Запутался в регистрах, чегото не получается.
Вобшем нужно замерить напряжение на ADC6 и ADC7 и записать в соответствующие переменные.
volatile unsigned char I_ADC;
volatile unsigned char U_ADC;
void ADC_I (void){ //делаем АЦП ADC6
ADMUX=0b00100110;
ADCSRA=0b11000111;
I_ADC=ADCH;
}
void ADC_U (void){ //делаем АЦП ADC7
ADMUX=0b00100111;
ADCSRA=0b11000111;
U_ADC=ADCH;
}
|
|
|
|
04.11.2010, 07:00
|
|
Вид на жительство
Регистрация: 07.03.2005
Сообщений: 300
Сказал спасибо: 13
Сказали Спасибо 117 раз(а) в 62 сообщении(ях)
|
Re: Помогите с регистрами АЦП ATMega8535
Посмотрите, может поможет.
|
|
|
|
04.11.2010, 07:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
|
Re: Помогите с регистрами АЦП ATMega8535
ADCSRA=0b11000111;
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 --- ADCSRA
The first conversion after
ADSC has been written after the ADC has been enabled, or if ADSC is written at the
same time as the ADC is enabled, will take 25 ADC clock cycles instead of the normal
13. This first conversion performs initialization of the ADC.
Подождать может нужно?
ADCSRA=0b11000111; делитель на 128 , Xtal/128 частота ,13 циклов (первое , вообще 25 циклов)
Последний раз редактировалось OlegNZH; 04.11.2010 в 07:29.
|
|
|
|
04.11.2010, 07:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: Помогите с регистрами АЦП ATMega8535
Да это так. По правде сказать мне по барабану какой делитель лиш бы выдерживалась точность в рамках 8 старших бит.
Цитата:
|
Подождать может нужно?
|
А как правильно подождать?
|
|
|
|
04.11.2010, 07:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
|
Re: Помогите с регистрами АЦП ATMega8535
бит есть , окончание преобразования ..
ADSC will read as one as long as a conversion is in progress. When the conversion is complete, it returns to zero. Writing zero to this bit has no effect. Запись "1" Запуск - как в ноль- упадёт- Свершилось ![Улыбка](images/smilies/icon_smile.gif)
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 --- ADCSRA
ADCSRA |= 0x40; (Запуск)
while(ADCSRA && 0x40); Ждём
(Коряво конечно ![Обижен](images/smilies/icon_beee.gif) есть стандартные Записи,)
Последний раз редактировалось OlegNZH; 04.11.2010 в 08:13.
Причина: while по- Паскалевски , блин, с большой буквы написал
|
|
|
|
04.11.2010, 08:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: Помогите с регистрами АЦП ATMega8535
Правильно ли я понимаю что перед строкой I_ADC=ADCH;
нужно поставить delay, или подождать пока ADSC станет 0
Последний раз редактировалось 7Fantomas7; 04.11.2010 в 08:08.
|
|
|
|
04.11.2010, 08:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
|
Re: Помогите с регистрами АЦП ATMega8535
delay можно подсчитать , но while- просто подождёт , когда бит скинется. А вообще - в прерываниях это делается. Слишком большая задержка на делителе 128. Пусть измеряет себе. Здесь Есть тонкости , можно читать До окончания пре....не не будем ....Лучше поставить делитель поменьше, и Прерывание , и в нём уже Честные данные считывать.
(Под CodeVision)-
interrupt [ADC_INT] void adc_isr(void)
{
//Считать канал куда-то его записать
//пОменять на новый(не забыть- какой измеряться будет!)
// Старт нового измерения
ADCSRA|=0x40;
}
ADMUX =0x27; //ADLAR=1 , 7 канал
ADCSRA =0x8E; //Ацп разрешено + прерывание+тактовая на 64
SFIOR &=0x00; // Free Running mode АЦП (старшие биты, младшие - не знаю что там будет)
#asm("sei")
// Первое измерение
ADCSRA|=0x40;
//delay подождать можно немного
while(1) {
//Брать уже записанные результаты, и что-то Делать с ними
}
Мог напутать чегойнибудь, но смысл такой..
Последний раз редактировалось OlegNZH; 04.11.2010 в 08:46.
|
|
|
Сказали "Спасибо" OlegNZH
|
|
|
04.11.2010, 08:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: Помогите с регистрами АЦП ATMega8535
Цитата:
|
А вообще - в прерываниях это делается.
|
Прерывание по окончанию преобразования? Не хотелось бы прерывания. Есть причина.
Цитата:
|
Слишком большая задержка на делителе 128
|
А какой минимально допустимый делитель можно установить при 16 мГц тактовой чтоб АЦП нормально 8 бит мерил.
|
|
|
|
04.11.2010, 09:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
|
Re: Помогите с регистрами АЦП ATMega8535
да на 8-ми- в принципе- любые , это когда дифференциальные меряются, с внутренним усилением 200, ставить Стопы, шумы убирать..и тд .. А так на делителе 64- около 20 кгц получается выборки.(минус 2 разряда ещё по точности)
|
|
|
|
04.11.2010, 09:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: Помогите с регистрами АЦП ATMega8535
Цитата:
|
да на 8-ми- в принципе- любые
|
Правильно ли я понимаю что и делитель 2 пойдет и все будет надежно работать.
Просто мне нужно померить от 0 до 255 с точностью 1, да желательно побыстрее. Просто с делителями тупанул изначально.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:32.
|
|