Свежие обсуждения
Микроконтроллеры

AVR начинающим - вопросы и ответы

1 42 68

Alexey: PS Какая-то хрень , "проглатываются " значки сдвигов.
Пишите их через пробел (иногда и два пробела требуются), тогда останутся.

 

Digital: Пишите их через пробел
Спасибо, учту.
Но дело, думаю не в программе. Проблема "железная".В интернете этот глюк упоминается.Только их решение мне не помогло.
АТ Мега 164Р

 

Alexey: Но дело, думаю не в программе. Проблема "железная".
Странно что в Errata ДШ для ATmega164P Rev.A вообще ничего. М.б. проблема всё-таки не "железная"?

 

Digital: М.б. проблема всё-таки не "железная"?
Все м.б. Но я и фары протирал и колесо пинал-непомогло.
Читал про аналогичную проблему , точь в точь . По двум каналам одно и тоже. Там выяснилось , что после переключения канала , АЦП делает холостое измерение и генерит прерывание .Я прерывание не использую, жду флаг. Пробовал подряд делать три измерения , брать последний результат. Не помогло. Пробовал понизить частоту. Тоже.

 

Alexey: Мне надо циклически мерять два напряжения.
Т.е. сначала одно, затем другое, но не одновременно?
Alexey: ...выяснилось [в аналогичной проблеме], что после переключения канала...
Ну если проблема аппаратная всё-таки, то или взять другой МК-р или поставить на вход коммутатор 2-->1, его переключать и измерять по одному каналу АЦП.

 

Digital: Т.е. сначала одно, затем другое, но не одновременно?
Естественно.

Digital: взять другой МК-
Это не возможно.

В ДШ написано:
ADMUX can be safely updated in the following ways:
1. When ADATE or ADEN is cleared.
2. During conversion, minimum one ADC clock cycle after the trigger event.
3. After a conversion, before the Interrupt Flag used as trigger source is cleared.
When updating ADMUX in one of these conditions, the new settings will affect the next ADC
conversion.
По 2 пункту : пробовал подождать 128 тактов МК после запуска АЦП , и изменить канал, тоже не помогло.

 

Alexey: там выяснилось, что после переключения канала , АЦП делает холостое измерение и генерит прерывание
Да, на стр.242 ДШ кстати так и сказано, что первое преобразование, после переключения канала, может быть ошибочным.

А не пробовали использовать не 0 и 1 каналы, а, к примеру, 4 и 7? Просто, смотрю вот, пары 0-1 и 2-3 - дифференциальные входы и, возможно не учитываются какие-то особенности работы с ними?

Из русскоязычной литературы (http://ifolder.ru/14165424 1.1Мб pdf):
***
Отдельно следует сказать о каналах с дифференциальным входом.
После смены таких каналов первое измерение следует производить не ранее
чем через 125 мкс после выбора канала. Указанное время требуется для
установления значения коэффициента усиления предусилителя.
Соответственно, значения, измеренные до истечения этого срока, не могут
считаться достоверными. Кроме того, при переключении на канал с
изменяемым коэффициентом усиления результат первого преобразования может
иметь пониженную точность из-за времени установления автоматической
схемы коррекции смещения. Поэтому будет лучше считать результат
первого преобразования некорректным.
***

 

Digital: А не пробовали использовать не 0 и 1 каналы,
нет , уже плата разведена.

Пробовал мерять по три раза подряд , не помогло.

 

Не совсем понял, для чего делается вот эта строка, и что вы ей хотели сказать:
DIDR0 = (1 < ADC2D | 1 < ADC0D);
Во-первых, ИМХО, тут явно нужны скобки, т.е. (1 < ADC2D) | (1 < ADC0D); а во-вторых, вы используете каналы 0 и 1, а отключаете цифровой ввод по каналам 0 и 2.

 

chav1961: Не совсем понял
"Не виноватая я.." (С) , это оно похерило, само, на самом деле у меня не два, а три канала отключено.
chav1961: ИМХО, тут явно нужны скобки
Как скажите , но по моему справочнику сдвиги "главнее" "или" и присваивания.
Но ,возможно ,лучше перебздеть, чем недобздеть.

Все, подсказали . Проблема была софтовая : while (!ADIF); , а надо :
while(!(ADCSRA & (1ADIF)));

Еще вопрос , надо поделить байт на 6.4(десятые могут подбираться) и результат получит байт(unsigned char)