|
Вывод 2 байтов АЦП в одну переменную, ATMega 2561 - как считать ADCH:ADCL одним числом? |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 21)
|
Feb 11 2011, 08:40
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(firstvald @ Feb 11 2011, 12:20)  вот несколько по другому: вот несколько по-третьему Код val=ADCL; val |= (uint16_t)ADCH<<8; В отличие от . - сохраняет правильный порядок и не содержит ошибки с приведением типов.
|
|
|
|
|
Feb 11 2011, 15:12
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Палыч @ Feb 11 2011, 18:02)  Зачем это делать? Просто нужно усвоить/запомнить, что к шестнадцатибитным регистрам нужно обращаться по их именам, а не побайтно! Это разумеется - компилятор обучен порядку чтения-записи слов. Но бывает так, что старший и младший байты слова располагаются в памяти не в соседних ячейках. Поубивал бы...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 12 2011, 08:10
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Код uint16_t* pADC = &ADC; Вы об этом? Цитата(_Pasha @ Feb 11 2011, 18:54)  +1 или за UART_RX_vect, USART_RX_vect, UART_RX_vect - приходится костылями обзаводиться. Да с U(S)ART'ами та ещё песня. Ну почему бы всегда не давать им номер? Пусть будет под номером 0, даже если он один одинёшенек. Что-то размечтался я:-)
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 12 2011, 18:08
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 19-11-08
Пользователь №: 41 782

|
Цитата(_Pasha @ Feb 12 2011, 13:30)  Он об этом - дык там всегда чтение младший-старший, запись старший-младший. А шо тут думать? А шо туть думать ? А если подумать? Цитата Практическая полезность представления результата с выравниванием слева существует, когда достаточно 8-разрядное разрешение, т.к. в этом случае необходимо считать только регистр ADCH. В другом же случае необходимо первым считать содержимое регистра ADCL, а затем ADCH, чем гарантируется, что оба байта являются результатом одного и того же преобразования. Как только выполнено чтение ADCL блокируется доступ к регистрам данных со стороны АЦП. Это означает, что если считан ADCL и преобразование завершается перед чтением регистра ADCH, то ни один из регистров не может модифицироваться и результат преобразования теряется. После чтения ADCH доступ к регистрам ADCH и ADCL со стороны АЦП снова разрешается. Конец цитаты. "...то ни один из регистров не может модифицироваться и результат преобразования теряется...." вот здесь скорее всего некорректно- "...то ни один из регистров не может модифицироваться и результат преобразования не должен потеряться". ИМХО (не проверял- просто - логика) upd. Задело меня что-то - АЦП - последовательного приближения - старший байт - первый- рабочий ...Он - самый живой должен быть "и преобразование завершается перед чтением регистра ADCH" да есть уже в Н байт! L- вторично!
Сообщение отредактировал OlegNZH - Feb 12 2011, 18:15
|
|
|
|
|
Feb 13 2011, 08:39
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 19-11-08
Пользователь №: 41 782

|
Цитата(demiurg_spb @ Feb 13 2011, 01:00)  Ничего не понял из написанного Вами, может это после 6-ти рабочих дней... Что конкретно Вам не понятно или с чем Вы не согласны? я просто развернул предыдущее сообщение - по поводу- кто старшее... младший-старший - это просто перевод из даташита- как нужно обращаться с байтами АЦП , ничего более.
|
|
|
|
|
Feb 13 2011, 11:40
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(OlegNZH @ Feb 13 2011, 02:08)  А шо туть думать ? А если подумать? ...то ни один из регистров не может модифицироваться и результат преобразования теряется...." вот здесь скорее всего некорректно... Код, написанный программистом, наконец-то удосужился прочитать результат (не)давнего измерения ADC, и, согласно документации, начинает с младшего байта, читает ADCL. В этот момент, ВНЕЗАПНО, завершается новое измерение ADC. Чтобы не пугать программиста, МК не перезаписывает новое значение в ADCH, давая завершить начатую программистом операцию чтения предыдущего значения ADC, что бы не получилось ADCH(от нового измерения)+ADCL(от предыдущего измерения). Что здесь некорректно?
|
|
|
|
|
Feb 14 2011, 10:21
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(demiurg_spb @ Feb 11 2011, 12:01)  Народ! Это же стандартная фишка для AVR! Ну напишите макрос или инлайн вставку на асме и будет счастье! Зачем всякий раз писать эту каку??? Народ, я с вас худею. После того, как топикстартер ответил, что он написал a=ADC и у него все получилось, вы накидали еще страницу советов, причем каждый следующий более идиотский чем предыдущий. На хера, объясните мне, писать асмовую вставку, если можно написать a=ADC ?!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|