Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вывод 2 байтов АЦП в одну переменную
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Slavast
Всем Доброго!
Atmega 2561. 1024 разрядный АЦП.
Мах значение на АЦП 0x03FF:
ADCH 0000.0011
ADCL 1111.1111
Хочу прочитать в одну переменную значение регистров АЦП ADCH и ADCL! Как в Си в старший разряд 2-байтовой переменной загнать значение ADCH, а в младший разряд - значение ADCL? Может есть какая-то команда сдвига внутри переменной, которую я никак не найду?
Ведь просто сложить ADCH и ADCL в одну переменную нельзя, т.к. мы нарушим паритет разрядности! (03+FF не будет равно 03FF)
Благодарю!
Alex_1811
=ADCH<<8+ADCL
Сергей Борщ
Alex_1811 подсказал, как сделать то, что вы хотите. Но хотите ли вы это делать? Посмотрите внимательно заголовочный файл для вашего процессора, обратите внимание на sfr с именем ADC.
777777
Цитата(Alex_1811 @ Feb 7 2011, 13:15) *
=ADCH<<8+ADCL

Так делать нельзя потому что читать нужно сначала ADCL, а потом ADCH, а какой код сгенерирует компилятор никто не гарантирует.

Нужно писать val = ADC; в этом случае компилятор сгенерирует чтение в правильной последовательности.
defunct
Цитата(Alex_1811 @ Feb 7 2011, 12:15) *
=ADCH<<8+ADCL

Если написать так как вы советуете получите такую последовательность действий:

= ADCH << (8 + ADCL);
Slavast
Спасибо!
Получилось a=ADC!
firstvald
вот несколько по другому:

adc=ADCL+ADCH*0x100;

кстати, компилятор запросто может один и тот же код сгенерировать и для этого и для варианта со сдвигом.
_Pasha
Цитата(firstvald @ Feb 11 2011, 12:20) *
вот несколько по другому:

вот несколько по-третьему
Код
val=ADCL;
val |= (uint16_t)ADCH<<8;

В отличие от . - сохраняет правильный порядок и не содержит ошибки с приведением типов.
demiurg_spb
Народ! Это же стандартная фишка для AVR!
Ну напишите макрос или инлайн вставку на асме и будет счастье!
Зачем всякий раз писать эту каку???
Палыч
Цитата(demiurg_spb @ Feb 11 2011, 12:01) *
Ну напишите макрос или инлайн вставку на асме и будет счастье!
Зачем это делать? Просто нужно усвоить/запомнить, что к шестнадцатибитным регистрам нужно обращаться по их именам, а не побайтно!
demiurg_spb
Цитата(Палыч @ Feb 11 2011, 18:02) *
Зачем это делать? Просто нужно усвоить/запомнить, что к шестнадцатибитным регистрам нужно обращаться по их именам, а не побайтно!
Это разумеется - компилятор обучен порядку чтения-записи слов.
Но бывает так, что старший и младший байты слова располагаются в памяти не в соседних ячейках.
Поубивал бы...
_Pasha
Цитата(demiurg_spb @ Feb 11 2011, 18:12) *
Но бывает так, что старший и младший байты слова располагаются в памяти не в соседних ячейках.
Поубивал бы...

+1 или за UART_RX_vect, USART_RX_vect, UART_RX_vect - приходится костылями обзаводиться.
arttab
а если создать в озу указатель на регистровую пару ADCL ADCH типа int? для флешь и озу это нормально, а тут сообразить не могу.
demiurg_spb
Код
uint16_t* pADC = &ADC;
Вы об этом?

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

Он об этом - дык там всегда чтение младший-старший, запись старший-младший. А шо тут думать?
OlegNZH
Цитата(_Pasha @ Feb 12 2011, 13:30) *
Он об этом - дык там всегда чтение младший-старший, запись старший-младший. А шо тут думать?

А шо туть думать ? А если подумать?
Цитата
Практическая полезность представления результата с выравниванием слева существует, когда достаточно 8-разрядное разрешение, т.к. в этом случае необходимо считать только регистр ADCH. В другом же случае необходимо первым считать содержимое регистра ADCL, а затем ADCH, чем гарантируется, что оба байта являются результатом одного и того же преобразования. Как только выполнено чтение ADCL блокируется доступ к регистрам данных со стороны АЦП. Это означает, что если считан ADCL и преобразование завершается перед чтением регистра ADCH, то ни один из регистров не может модифицироваться и результат преобразования теряется. После чтения ADCH доступ к регистрам ADCH и ADCL со стороны АЦП снова разрешается.
Конец цитаты.

"...то ни один из регистров не может модифицироваться и результат преобразования теряется...." вот здесь скорее всего некорректно- "...то ни один из регистров не может модифицироваться и результат преобразования не должен потеряться". ИМХО (не проверял- просто - логика)
upd. Задело меня что-то - АЦП - последовательного приближения - старший байт - первый- рабочий ...Он - самый живой должен быть "и преобразование завершается перед чтением регистра ADCH" да есть уже в Н байт! L- вторично!
demiurg_spb
Ничего не понял из написанного Вами, может это после 6-ти рабочих дней...
Что конкретно Вам не понятно или с чем Вы не согласны?
OlegNZH
Цитата(demiurg_spb @ Feb 13 2011, 01:00) *
Ничего не понял из написанного Вами, может это после 6-ти рабочих дней...
Что конкретно Вам не понятно или с чем Вы не согласны?

я просто развернул предыдущее сообщение - по поводу- кто старшее... младший-старший - это просто перевод из даташита- как нужно обращаться с байтами АЦП , ничего более.
ae_
Цитата(OlegNZH @ Feb 13 2011, 02:08) *
А шо туть думать ? А если подумать?
...то ни один из регистров не может модифицироваться и результат преобразования теряется...." вот здесь скорее всего некорректно...

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

Херовенько развернули. sad.gif
Для того, чтобы не задаваться вопросом, как и куда пишутся/читаются переменные типа 16-бит, раз и навсегда принято правило, чтобы не было конфуза при обращении к SFR
777777
Цитата(demiurg_spb @ Feb 11 2011, 12:01) *
Народ! Это же стандартная фишка для AVR!
Ну напишите макрос или инлайн вставку на асме и будет счастье!
Зачем всякий раз писать эту каку???

Народ, я с вас худею. После того, как топикстартер ответил, что он написал a=ADC и у него все получилось, вы накидали еще страницу советов, причем каждый следующий более идиотский чем предыдущий. На хера, объясните мне, писать асмовую вставку, если можно написать a=ADC ?!
demiurg_spb
Перечитайте внимательно еще раз, а уже потом материтесь...
Умный и вежливый Вы наш!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.