|
|
 |
Ответов
|
Sep 29 2013, 23:25
|

Профессионал
    
Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955

|
Для полноты картины почитайте параграф "Accessing 16-bits Registers" в мануале по xmeg'ам. Коротко: при чтении сначала читайте младший байт, при этом в том же цикле старший байт будет занесен во временный регистр. Второй командой читайте старший байт, он будет считан из временного регистра. Перед чтением запретите прерывания, т.к. временный регистр на АЦП всего один, и в прерываниях могут быть команды доступа к 16-разрядным регистрам, которые испортят содержимое временного. Этот регистр доступен и сам по себе, называется ADCA_TEMP.
Эта тема - одна из причин, почему я предпочитаю ассемблер. Сишные программисты редко лезут в такие дебри. Была одна небольшая задачка (реализация ЧМ детектора на TigerSharс), которую я для теста написал на Си, чтобы не углубляться в архитектуру. Все быстро заработало, но для боевого применения в многоканальных системах обработки данных предпочту asm-реализацию с полным доступом ко всем вкусностям архитектуры TigerSharс. Хотя, возможно, такое возможно и на чистом Си, но с обязательным учетом особенностей аппаратной архитектуры.
|
|
|
|
|
Sep 30 2013, 00:31
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(V_G @ Sep 30 2013, 03:25)  Коротко: при чтении сначала читайте младший байт, при этом в том же цикле старший байт будет занесен во временный регистр. Второй командой читайте старший байт, он будет считан из временного регистра. Но на C чтение двухбайтового значения именно так и происходит: Код // ADC_data = ADCA.CH1.RES; LDS R16, 556 LDS R17, (556+1) ... Я бы и на ассемблере короче не написала. Цитата(V_G @ Sep 30 2013, 03:25)  Перед чтением запретите прерывания, т.к. временный регистр на АЦП всего один, и в прерываниях могут быть команды доступа к 16-разрядным регистрам, которые испортят содержимое временного. Этот регистр доступен и сам по себе, называется ADCA_TEMP. А вот это непонятно. Почему команды доступа к 16-разрядным регистрам в прерываниях должны портить именно ADCA_TEMP? А если они к АЦП никак не относятся (скажем, это 16-разрядный регистр таймера), то содержимое ADCA_TEMP тоже будет угроблено? Или вы имели в виду только обращения к 16-разрядным регистрам других каналов АЦП? На счет запрета прерывания тоже имею вопрос: годится ли вместо пары STI/CLI запись CCP=0xD8, или protected IO register не может быть в этом деле помощником? Говорят, что он на 4 такта работу блокирует, там может быть этого хватит?
|
|
|
|
|
Sep 30 2013, 02:14
|

Профессионал
    
Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955

|
Цитата(Xenia @ Sep 30 2013, 10:31)  Почему команды доступа к 16-разрядным регистрам в прерываниях должны портить именно ADCA_TEMP? А если они к АЦП никак не относятся (скажем, это 16-разрядный регистр таймера), то содержимое ADCA_TEMP тоже будет угроблено? Или вы имели в виду только обращения к 16-разрядным регистрам других каналов АЦП? Если в прерываниях доступ к 16-разрядным регистрам AЦП не предполагается (или если само считывание идет в прерывании высокого приоритета), то можно и не запрещать прерывания, т.к. у других блоков свои временные регистры. Тем не менее, если процедуры других прерываний достаточно длинные, я бы запретил прерывания при чтении АЦП от греха подальше. Цитата(Xenia @ Sep 30 2013, 10:31)  На счет запрета прерывания тоже имею вопрос: годится ли вместо пары STI/CLI запись CCP=0xD8, или protected IO register не может быть в этом деле помощником? Говорят, что он на 4 такта работу блокирует, там может быть этого хватит? Вроде особых противопоказаний нет, но надо смотреть, какой код сгенерирует компилятор (включая запись CCP). Тут где-то обсуждалось, что иногда вставляется что-то типа цепочки RJMP next_addr которые могут расходовать драгоценные защищенные циклы.
|
|
|
|
Сообщений в этой теме
serj32 Флаг ADIF регистра ADCSRA-в АЦП ATmega8-непонятно Sep 27 2013, 14:49 ARV он сбросится аппаратно в момент перехода на обрабо... Sep 27 2013, 14:56 serj32 Цитата(ARV @ Sep 27 2013, 18:56) он сброс... Sep 27 2013, 15:23 RabidRabbit В том экземпляре даташита, что есть у меня, в опис... Sep 27 2013, 15:38 ARV для обучения лучше делать правильно, а не "ка... Sep 27 2013, 18:57 serj32 Цитата(ARV @ Sep 27 2013, 22:57) для обуч... Sep 27 2013, 20:33  Сергей Борщ QUOTE (serj32 @ Sep 27 2013, 22:33) А есл... Sep 28 2013, 06:55 RabidRabbit Цитата(ARV @ Sep 27 2013, 22:57) для обуч... Sep 28 2013, 07:51  ARV Цитата(RabidRabbit @ Sep 28 2013, 11:51) ... Sep 28 2013, 13:30   RabidRabbit Цитата(ARV @ Sep 28 2013, 17:30) вы увере... Sep 29 2013, 11:50 V_G Идея топикстартера корректно реализуема в atxmega,... Sep 27 2013, 23:31 Xenia Цитата(V_G @ Sep 28 2013, 03:31) АЦП рабо... Sep 28 2013, 21:03 V_G Названия регистров различаются в Си и ассемблере (... Sep 28 2013, 22:52 Xenia Цитата(V_G @ Sep 29 2013, 02:52) Названия... Sep 28 2013, 23:09 V_G Ну так я написал же, что содержимое регистров один... Sep 29 2013, 00:48 Xenia Цитата(V_G @ Sep 29 2013, 04:48) Ну так я... Sep 29 2013, 20:06 serj32 Хотел бы уточнить по флагу ADIF регистра ADCSRA.Во... Oct 1 2013, 08:23 RabidRabbit Цитата(serj32 @ Oct 1 2013, 12:23) Вот ес... Oct 1 2013, 09:58 V_G Если преобразование еще не завершено, то и флаг AD... Oct 1 2013, 08:53 serj32 Цитата(V_G @ Oct 1 2013, 12:53) Если прео... Oct 1 2013, 12:03  Сергей Борщ QUOTE (serj32 @ Oct 1 2013, 14:03) Мне не... Oct 1 2013, 12:26 serj32 Цитата(V_G @ Oct 1 2013, 12:53) Если прео... Oct 1 2013, 14:17 ILYAUL Повторю сказанное выше IDIF сбрасывается аппаратно... Oct 1 2013, 14:41
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|