реклама на сайте
подробности

 
 
> 16 BIT -> 2 * 8 BIT, не получаеться взять побайтовый результат из АЦП
pfg
сообщение Apr 7 2008, 13:05
Сообщение #1





Группа: Участник
Сообщений: 5
Регистрация: 8-02-07
Пользователь №: 25 175



пишу полд ИАРом
Вот кусочек кода с дизасмеблером

unsigned char bb, cc, dd, ee;

ADC12MEM0 = 0x0456;
008130 40B2 0456 0140 mov.w #0x0456,&ADC12MEM0

bb = *((unsigned char*)0x140);
008136 42D2 0140 0200 mov.b &ADC12MEM0,&bb

cc = *((unsigned char*)0x141);
00813C 425C 0141 mov.b &0x141,R12
008140 4CC2 0201 mov.b R12,&cc

dd = ( (unsigned char*) & ADC12MEM0) [1];
008144 42D2 0141 0202 mov.b &0x141,&dd

ee = ( (unsigned char *) ADC12MEM0_) [1];
00814A 42D2 0141 0203 mov.b &0x141,&ee

В програмной эмуляции
происходит желаемое

в bb младший байт
в сс dd ee старший байт.

за пускаю на железе
во все (bb cc dd ee) пишет младший байт
Почему даже понять не могу
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
pfg
сообщение Apr 8 2008, 07:16
Сообщение #2





Группа: Участник
Сообщений: 5
Регистрация: 8-02-07
Пользователь №: 25 175



спсибо за разьяснение структуры, именно это и не укладывалось в башке.
правда указанный пример все равно не работает smile.gif

ADC12MEM0 = 0x0956;
008120 40B2 0956 0140 mov.w #0x956,&ADC12MEM0

dd =(unsigned char)(ADC12MEM0);
008126 421E 0140 mov.w &ADC12MEM0,R14
00812A 4EC2 0204 mov.b R14,&dd

ee =(unsigned char)(ADC12MEM0>>8);
00812E 93C2 0140 tst.b &ADC12MEM0
008132 42D2 0141 0205 mov.b &0x141,&ee

опять пытаеться обратиться по "сдвинутому" адресу
сделал без извращений

aa = ADC12MEM0 ;
008138 4292 0140 0200 mov.w &ADC12MEM0,&aa

bb =(unsigned char)(aa);
00813E 42D2 0200 0202 mov.b &aa,&bb

cc =(unsigned char)(aa>>8);
008144 42D2 0201 0203 mov.b &0x201,&cc
smile3046.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 8 2008, 07:42
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(pfg @ Apr 8 2008, 10:16) *
спсибо за разьяснение структуры, именно это и не укладывалось в башке.
Вот из документации, на всякий случай:
Цитата
1.4.3 Peripheral Modules
Peripheral modules are mapped into the address space. The address space from 0100 to 01FFh is reserved for 16-bit peripheral modules. These modules should be accessed with word instructions. If byte instructions are used, only even addresses are permissible, and the high byte of the result is always 0.
Цитата(pfg @ Apr 8 2008, 10:16) *
правда указанный пример все равно не работает smile.gif

опять пытаеться обратиться по "сдвинутому" адресу
сделал без извращений
Это уже оптимизатор работает. Хм, а вот интересно - что надо будет делать, когда оптимизатор поумнеет настолько, что и второй ваш вариант соптимизирует до первого? Или я что-то недопонимаю, или компилятор не должен оптимизировать обращения к volatile-переменным. Надо будет почитать стандарт на эту тему.

P.S. для оформления кода в форме кода есть кнопочка с символом #


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 03:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01938 секунд с 7
ELECTRONIX ©2004-2016