Проблема с АЦП Меги8

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Проблема с АЦП Меги8

Сообщение Goofy » 09 янв 2007, 18:27

Суть проблемы в том, что на выходе со всех задействованых каналов АЦП получаю 0x03FF, то есть максмальные 1023 10 разрядного АЦП...
Мерил напряжения на ножках, оно находиться в пределах соотносимого напряжения  (внутренние 2,56В) В VMLAB всё работает корректно. В чём может заключаться этот баг? Быть может дух АЦП покину грешное тело контроллера ? предпосылки к этому вероятны :))
Goofy
 
Сообщения: 45
Зарегистрирован: 30 сен 2005, 14:04
Откуда: Красноярск
прог. языки: C, C++
ФИО: Макаров Иван

Сообщение KiCom » 09 янв 2007, 19:28

Какое напряжение на вход АЦП подаешь?
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение Goofy » 09 янв 2007, 20:48

KiCom писал(а):Какое напряжение на вход АЦП подаешь?


На входе в момент тестов напряжение в пределах 0,5В, вольтметром проверено.
Goofy
 
Сообщения: 45
Зарегистрирован: 30 сен 2005, 14:04
Откуда: Красноярск
прог. языки: C, C++
ФИО: Макаров Иван

Сообщение -= Александр =- » 09 янв 2007, 20:57

Какое устанавливаешь ADMUX для каждого из каналов и к чему припаяны AVCC и AREF? Какая на них обвязка?
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение Goofy » 09 янв 2007, 21:46

-= Александр =- писал(а):Какое устанавливаешь ADMUX для каждого из каналов и к чему припаяны AVCC и AREF? Какая на них обвязка?

ADMUX в соответствие внутреннему соотносимому 2,56 В и биты в соответсвие каналу, говорю же в эмуляторе работает.
AVCC тоже что и Vcc AREF не подключён. AVCC через индуктивность,  с конденсатором на землю. AREF оставлен без кондёра, вроде как не "по уставу", но работало на меге128.


код не совсем наглядный, тк преобразование начинается с ADC6, а потом последовательно от ADC3 к ADC0

Код: Выделить всё
// запускаем последовательность  так
      ADCdone=0;
         i=0;
         ADMUX=_BV(REFS1)|_BV(REFS0)|0x06; // starting from battary voltage
         sbi(ADCSRA,ADSC);

далльше анализируем по прерыванию

SIGNAL(SIG_ADC)
{


if (i==0)
      
      {ADCData[0]=(ADCH<<8) + ADCL;
      
      ADMUX=_BV(REFS1)|_BV(REFS0)|0x03; // next will be ADC3
      sbi(ADCSRA,ADSC);
      i++;
      
      } else
      {
      ADCData[i]=(ADCH<<8) + ADCL;
      i++;
      
      
      if (i>4) {ADCdone=1;} else {ADMUX=_BV(REFS1)|_BV(REFS0)|(0x04 - i);sbi(ADCSRA,ADSC); }
      
      }
}

Последний раз редактировалось Goofy 09 янв 2007, 21:59, всего редактировалось 2 раз(а).
Goofy
 
Сообщения: 45
Зарегистрирован: 30 сен 2005, 14:04
Откуда: Красноярск
прог. языки: C, C++
ФИО: Макаров Иван

Сообщение D-M » 09 янв 2007, 21:52

Goofy писал(а):AVCC тоже что и Vcc AREF не подключён. AVCC через индуктивность,  с конденсатором на землю. AREF оставлен без кондёра.

:shock:  :shock:  :shock:
вы не чего непутаете?
AVCC через индуктивность к +5 обычно
и какже без опорного напряжения
или я что-то не так понял
Аватара пользователя
D-M
 
Сообщения: 486
Зарегистрирован: 28 мар 2006, 17:28
Откуда: Пенза

Сообщение Goofy » 09 янв 2007, 22:27

D-M писал(а):
Goofy писал(а):AVCC тоже что и Vcc AREF не подключён. AVCC через индуктивность,  с конденсатором на землю. AREF оставлен без кондёра.

:shock:  :shock:  :shock:
вы не чего непутаете?
AVCC через индуктивность к +5 обычно
и какже без опорного напряжения
или я что-то не так понял

всё правильно к +5 но через индуктивность. Устав твердит что так будет меньше шуму. Опорное напряжения подключается внутреннее, то есть 2,56В
Goofy
 
Сообщения: 45
Зарегистрирован: 30 сен 2005, 14:04
Откуда: Красноярск
прог. языки: C, C++
ФИО: Макаров Иван

Сообщение -= Александр =- » 09 янв 2007, 23:06

При внутреннем опорном требуется заземлить AREF кондером, желательно даже электролитом...

Читай даташит про ADCSRA - точно где-то в нем ошибка. Или прерывание не разрешил или вообще АЦП не включил...

Кстати могло и сгореть АЦП - у меня уже было такое, что один из каналов сгорел...
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение D-M » 10 янв 2007, 01:52

Goofy писал(а):
D-M писал(а):
Goofy писал(а):AVCC тоже что и Vcc AREF не подключён. AVCC через индуктивность,  с конденсатором на землю. AREF оставлен без кондёра.

:shock:  :shock:  :shock:
вы не чего непутаете?
AVCC через индуктивность к +5 обычно
и какже без опорного напряжения
или я что-то не так понял

всё правильно к +5 но через индуктивность. Устав твердит что так будет меньше шуму. Опорное напряжения подключается внутреннее, то есть 2,56В


я так и не понял вы AREF куда присоединили к земле или +5 ?  :oops:
Аватара пользователя
D-M
 
Сообщения: 486
Зарегистрирован: 28 мар 2006, 17:28
Откуда: Пенза

Сообщение Goofy » 10 янв 2007, 07:28

D-M писал(а):я так и не понял вы AREF куда присоединили к земле или +5 ?  :oops:


Никуда! Для того чтобы воспользоваться опорным напряжением внутри микрухи в 2.56, AREF не подключается или подключается к кер. конденсатору который висит на "земле" для лучшей помехозащиты.
Goofy
 
Сообщения: 45
Зарегистрирован: 30 сен 2005, 14:04
Откуда: Красноярск
прог. языки: C, C++
ФИО: Макаров Иван

Сообщение Goofy » 10 янв 2007, 07:38

-= Александр =- писал(а):При внутреннем опорном требуется заземлить AREF кондером, желательно даже электролитом...

Читай даташит про ADCSRA - точно где-то в нем ошибка. Или прерывание не разрешил или вообще АЦП не включил...

Кстати могло и сгореть АЦП - у меня уже было такое, что один из каналов сгорел...


Говорю же в ЭМУЛЯТОРОЕ РАБОТАЕТ, причём как нада (движками в ВМЛАБ меняется напряжение на каналах).  К тому же в пустом инициализированном массиве откуда взятся 0x03FF с моим алгоритмом. Уж работают прерыватья чтобы записать то 0x03FF с регистров на выходе с АЦП. А это уже резуальтат в реале, который лезет в мир через терминалку!

Код: Выделить всё
void InitADC ()
{
sbi(ADCSRA,ADEN); // ADC Enable
sbi(ADCSRA,ADIE); // Interrupt Enable
sbi(ADCSRA,ADPS2); // 4 vmlab
sbi(ADCSRA,ADPS1);
sbi(ADCSRA,ADPS0);
}


А все каналы сразу то почему отказали  ? :) по всем идёт 1023
Goofy
 
Сообщения: 45
Зарегистрирован: 30 сен 2005, 14:04
Откуда: Красноярск
прог. языки: C, C++
ФИО: Макаров Иван

Сообщение avr123.nm.ru » 10 янв 2007, 10:17

пока уберите переключение каналов и разберитесь с одним - так проще.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение Goofy » 10 янв 2007, 19:37

Суть косяка была в том, что сначала должно читаться ADCL, а потом тока ADCH.

То есть теперь запись в массив выглядит так:
Код: Выделить всё
ADCData[i]=ADCL + (ADCH<<8);


Две строчки в датащите и столько гимора без ведения о них :) Хоть восклицания поставили бы...
Goofy
 
Сообщения: 45
Зарегистрирован: 30 сен 2005, 14:04
Откуда: Красноярск
прог. языки: C, C++
ФИО: Макаров Иван

Сообщение avr123.nm.ru » 13 янв 2007, 11:59

Goofy писал(а):Суть косяка была в том, что сначала должно читаться ADCL, а потом тока ADCH.


а ... понятно ...   т.е. задачу 11 курса  

avr123.nm.ru/06.htm    не читали.

И примеры  C:\CVAVR\examples   не смотрели.

А тобы читали бы результат из ADCW
и CVAVR автоматически прочитал
регистры в правильном порядке.

Рекомендую прочитать все же курс на будущее.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение Goofy » 13 янв 2007, 17:37

avr123.nm.ru писал(а):
Goofy писал(а):Суть косяка была в том, что сначала должно читаться ADCL, а потом тока ADCH.


а ... понятно ...   т.е. задачу 11 курса  

avr123.nm.ru/06.htm    не читали.

И примеры  C:\CVAVR\examples   не смотрели.

А тобы читали бы результат из ADCW
и CVAVR автоматически прочитал
регистры в правильном порядке.

Рекомендую прочитать все же курс на будущее.


Предела у Вашей навязчивости, пожалуй, не существует :)))
Я работаю с ВинАВР
Goofy
 
Сообщения: 45
Зарегистрирован: 30 сен 2005, 14:04
Откуда: Красноярск
прог. языки: C, C++
ФИО: Макаров Иван

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20