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

 
 
> побайтный доступ к регистрам периферии, он есть или нет?
jorikdima
сообщение Jan 4 2010, 10:13
Сообщение #1


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Здравствуйте.
Работаю с msp430f5418. Там куча периферии всякой и вот я споткнулся на ровном месте. Возьмем к примеру Таймер А, у которого есть такой регистр TA0CTL расположенный по адресу 0x340. Он 16 разрядный, но в UG сказано про все регистры Таймера да и не только:
Цитата
NOTE: All registers have word or byte register access. For a generic register ANYREG, the suffix
"_L" (ANYREG_L) refers to the lower byte of the register (bits 0 through 7). The suffix "_H"
(ANYREG_H) refers to the upper byte of the register (bits 8 through 15).

То есть насколько я понимаю, можно обратиться побайтно к старшей части слова TA0CTL, то есть по адресу 0x341.
Сделав такой код
Код
//UINT8* p = (UINT8*)0x341;
    //*p = 0x1;

то есть попытку записать 1 в младший бит старшего байта, компилятор сделал вполне валидную команду
Код
mov.b #1, &0x341

Но исполнение этой команды привело к записи единицы в младший бит младшего байта регистра. Почему? Тоже самое с регистрами DMA. А вот если в обычную RAM писать ровно такими же командами, то все хорошо.
Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
Сергей Борщ
сообщение Jan 4 2010, 10:44
Сообщение #2


Гуру
******

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



Цитата(jorikdima @ Jan 4 2010, 12:13) *
Но исполнение этой команды привело к записи единицы в младший бит младшего байта регистра. Почему?
Такое поведение было характерно для до-54xx серий. Вы смотрели в железе или симуляторе? Если в железе - надо писать в техподдержку. Если в симуляторе - сами знаете wink.gif


--------------------
На любой вопрос даю любой ответ
"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
jorikdima
сообщение Jan 4 2010, 10:54
Сообщение #3


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(Сергей Борщ @ Jan 4 2010, 13:44) *
Такое поведение было характерно для до-54xx серий. Вы смотрели в железе или симуляторе? Если в железе - надо писать в техподдержку. Если в симуляторе - сами знаете wink.gif

В железе смотрел, правда через дебаггер. Можно конечно вычитать значение регистра железа в переменную какую-нибудь, мало ли как дебаггер там смотрит smile.gif. Но в целом спасибо, понял, вроде проблема не во мне.
Вообще с 5418 я тут так пляшу сейчас... какие то непонятные вещи он творит вообще.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 4 2010, 21:48
Сообщение #4


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Код
//UINT8* p = (UINT8*)0x341;
//*p = 0x1;

Может воспользоваться мнемоническими именами регмстров из заголовочного файла.
Работаю с 5437. Проблем не было, были проблемы с оптимизирующим компилятором от IAR. Таймер B работает строго по описанию.
Прочитайте errata а кристалл, там много про отладку. Я дебагер использовал с осторожностью.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jan 6 2010, 07:15
Сообщение #5


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(mdmitry @ Jan 5 2010, 00:48) *
Может воспользоваться мнемоническими именами регмстров из заголовочного файла.
Работаю с 5437. Проблем не было, были проблемы с оптимизирующим компилятором от IAR. Таймер B работает строго по описанию.
Прочитайте errata а кристалл, там много про отладку. Я дебагер использовал с осторожностью.

Да я естественно с мнемонических имен и начал, тут специально привел явный адрес ибо проблема именно в нечетности адреса байта. Про дебаггер не читал с таком талмуде (других слов нет) на 5х серию, посмотрю.
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Jan 11 2010, 07:44
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



Цитата(jorikdima @ Jan 4 2010, 13:54) *
Вообще с 5418 я тут так пляшу сейчас... какие то непонятные вещи он творит вообще.


А если не секрет, с чем именно возникли сложности? Я тоже с 5418 работал, использовал только таймера, АЦП (без ДМА), УАРТ и еще во флэш писал (как в инфо-мемори так и в другие сектора), все работало в адекватно и в соответствии с мануалом. А у Вас с какой периферией трудности?
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jan 11 2010, 08:03
Сообщение #7


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(Юрий Санвальд @ Jan 11 2010, 10:44) *
А если не секрет, с чем именно возникли сложности? Я тоже с 5418 работал, использовал только таймера, АЦП (без ДМА), УАРТ и еще во флэш писал (как в инфо-мемори так и в другие сектора), все работало в адекватно и в соответствии с мануалом. А у Вас с какой периферией трудности?

Да в общем ляпнул не поделу smile.gif На вышеупомянутой проблемме все и ограничилось. Сейчас в поддержку ТИ пишу, о результатах сообщу.
Все сложности были по моей причине (прерывание приходило, котороя я не ждал smile.gif ) и по причине наличия ассемблерного модуля софтового RTC (из древних примеров ТИ), которые надо тоже портировать на MSP430X, а я этого не сделал.
В общем софт свой портировал - вроде живет (UART, SPI, DMA, ADC12, TimerA, WDT, MPY).
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 11 2010, 11:23
Сообщение #8


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



jorikdima, Вы примеры для 5438 от TI посмотрите для работы с RTC (slac227f и slac166m)


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jan 11 2010, 12:37
Сообщение #9


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(mdmitry @ Jan 11 2010, 14:23) *
jorikdima, Вы примеры для 5438 от TI посмотрите для работы с RTC (slac227f и slac166m)

Это я видел. Раньше я на 1611 был, там аппаратного RTC не было, я софтовый пользовал от ТИ, а он на асме.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jan 22 2010, 12:45
Сообщение #10


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Переписываюсь с саппортом. То ли я чего то не понимаю, то ли саппорт, рассудите плиз. Вот наша переписка:

Я:
Цитата
In the User Guide for MSP430F54XX said (for example for TimerA): NOTE: All registers have word or byte register access. For a generic register ANYREG, the suffix "_L" (ANYREG_L) refers to the lower byte of the register (bits 0 through 7). The suffix "_H" (ANYREG_H) refers to the upper byte of the register (bits 8 through 15). So it means that e.g. register TA0CTL which is 16 bit width can be byte accessed either MSB byte or LSB byte. So I tried to modify only MSB byte using the following simple code: unsigned char* p = (unsigned char*)0x341; *p = 0x1; But as the result only LSB byte was was modified. This is true also e.g. DMA registers and I suppose for all periphery registers. If try to modify simple RAM memory region such way no problem occurs. msp430f5418 rev L was used. Is there byte access to periphery registers in 5x uC?

Они:
Цитата
Why do you use 'char' here - which is a 8 bit size variable?
I would recommend to use e.g. the predefined values for setting to TA0CTL which can be found in header files or also in TI code examples.

Я:
Цитата
The sample code that I wrote in my question was just to illustrate the problem I had. The problem was with writing periphery registers which are located at odd addresses. Just for illustration I took TimerA and wrote value to TA0CTL using explicit address 0x341. In my main code of course I use predefined values such as TA0CTL etc.
So my question is: if it is possible to have byte access to periphery registers in MSP430F54xx as it declared in UserGuide? Or may be I didn't understand something.

Они:
Цитата
I think the problem is caused as you are using 'char' in your code which is a 8bit variable.
In the examples I sent you can see it's possible to address 16 bit - could you please test your code without usage of 'char'?

Я:
Цитата
But why I can not use 'char' (8bit) in case I want to access only byte??
Ok, let's abstract our mind from C language. Can I access periphery registers using this assembler code:
mov.b #1, &0x341
where 0x341 is the explicit address of the odd part of TA0CTL? According to UserGuide I thought that "yes, I can." But really this command changes only even part of TA0CTL (at 0x340 address).

Они:
Цитата
Please be aware that you need to use the MOV.W command to have access/write to this registers. There are several code examples which show e.g.
mov.w #128,&TA1CCR0 ; PWM Period/2
mov.w #OUTMOD_6,&TA1CCTL1 ; CCR1 toggle/set
mov.w #32,&TA1CCR1 ; CCR1 PWM duty cycle
mov.w #OUTMOD_6,&TA1CCTL2 ; CCR2 toggle/set
mov.w #96,&TA1CCR2 ; CCR2 PWM duty cycle
mov.w #TASSEL_2 + MC_3 + TACLR,&TA1CTL

In header file you find the addresses of this registers e.g.
#define TA0CTL_ (0x0340) /* Timer0_A5 Control */
DEFCW( TA0CTL , TA0CTL_)
#define TA0CCTL0_ (0x0342) /* Timer0_A5 Capture/Compare Control 0 */
DEFCW( TA0CCTL0 , TA0CCTL0_)
#define TA0CCTL1_ (0x0344) /* Timer0_A5 Capture/Compare Control 1 */
DEFCW( TA0CCTL1 , TA0CCTL1_)
#define TA0CCTL2_ (0x0346) /* Timer0_A5 Capture/Compare Control 2 */
DEFCW( TA0CCTL2 , TA0CCTL2_)
#define TA0CCTL3_ (0x0348) /* Timer0_A5 Capture/Compare Control 3 */
DEFCW( TA0CCTL3 , TA0CCTL3_)
Not sure where exactly you do see a problem - maybe you can give me some more background?


Почему мне говорят, что я для побайтного доступа должен пользоваться mov.w а не mov.b???
Я чего-то не понимаю? Может я не понимаю, что такое побайтный доступ (byte register access). Я так полагал, что могу обратиться как для чтения, так и для записи к любому регистру (речь о перефирийных), независимо от того по четному адресу он расположен или нечетному и к любой части регистра (младшие 8 бит или старшие 8 бит 16 разрядного регистра). Я правильно понимаю термин?
Спасибо.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 22 2010, 13:11
Сообщение #11


Гуру
******

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



Цитата(jorikdima @ Jan 22 2010, 14:45) *
Почему мне говорят, что я для побайтного доступа должен пользоваться mov.w а не mov.b???
Потому что вы в первом письме вывалили на него слишком много информации, которую он просмотрел по диагонали. Зацепился глазом за TA0CTL и 8 бит и теперь пытается донести до вас, что TA0CTL - 16-битный, со всеми вытекающими. Сформулируйте вопрос более кратко: "Я пишу в TA0CTL_H, а значение попадает в TA0CTL_L. Какого фига?" Вопрос о байтовости отпадет сам. Можете сослаться на таблицу 12-3 усер гада. "К черту подробности" о том, что это части одного 16-битного регистра.


--------------------
На любой вопрос даю любой ответ
"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 Текстовая версия Сейчас: 27th July 2025 - 23:17
Рейтинг@Mail.ru


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