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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Споткнулся на IE1 в MSP430F449
shasik
сообщение Feb 8 2008, 10:09
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 3-09-05
Из: Беларусь, Новополоцк
Пользователь №: 8 188



Почему не работает код:
Код
IE1 |= URXIE0;

Соответствующая ему строка листинга:
Код
F2D040000000 BIS.B   #0x40, &0x0


Запускаю - не работает.
Начинаю проверять по шагам. Весь код работает как нужно (проверяю содержимое модифицируемых регистров отладчиком - View->Register). Выполняю эту строку - бит не устанавливается. Главное в IE2 биты устанавливаются, а этот нет.
Если написать IE1 |= URXIE0 прямо в окне Watch или просто вручную установить нужный бит в окне Register, то бит устанавливается и прерывание начинает срабатывать.

Процессор F449 (необходимый include сделал), версия IAR'a - 4.10.
Что я пропустил?
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 8 2008, 10:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Что значит "не работает"? Команда BIS.B #0x40, &0x0 не выполняется или UART не работает? Дебаггером в железе смотрите или в симуляторе пытаетесь отлаживать?
Go to the top of the page
 
+Quote Post
shasik
сообщение Feb 8 2008, 10:46
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 3-09-05
Из: Беларусь, Новополоцк
Пользователь №: 8 188



Цитата(rezident @ Feb 8 2008, 12:18) *
Что значит "не работает"? Команда BIS.B #0x40, &0x0 не выполняется или UART не работает? Дебаггером в железе смотрите или в симуляторе пытаетесь отлаживать?

Дебаггером в железе смотрю.
UART работает, а вот прерывание срабатывает только, если установить URXIE0 вручную. Т.е. запускаю железку., останавливаю выполнение, устанавливаю бит, запускаю продолжение выполнения - все прерывание срабатывает.

Расставил IE1 |= URXIE0 в разных местах - бит из программы не устанавливается.
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 8 2008, 11:50
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(shasik @ Feb 8 2008, 15:46) *
Расставил IE1 |= URXIE0 в разных местах - бит из программы не устанавливается.
Странно это. Буквально неделю назад корректировал проект в котором UART используется. Проект был создан еще в версии 3.30, а правил я его в версии 4.10. Как ни странно UART0 работает, именно по прерываниям. Проект корректировал так, чтобы его можно было использовать в трех модификациях устройства. В них используются MSP430F149, MSP430F1232 и MSP430F135 соответственно. Если для первого и третьего никаких отличий в программировании нет, то для второго кристалла отличия имеются. У него флаги разрешения прерываний и флаги запроса прерываний для UART0 в других регистрах располагаются, в IE2 и IFG2 соответственно. Тем не менее, оба варианта проекта скомпилировались и прошивки работают в железе.
P.S. проверьте правильно ли выбран кристалл в опциях проекта и тот ли заголовочный файл с описанием регистров вы подключаете?
Go to the top of the page
 
+Quote Post
shasik
сообщение Feb 9 2008, 22:16
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 3-09-05
Из: Беларусь, Новополоцк
Пользователь №: 8 188



Цитата(rezident @ Feb 8 2008, 13:50) *
Странно это.
...
P.S. проверьте правильно ли выбран кристалл в опциях проекта и тот ли заголовочный файл с описанием регистров вы подключаете?

Кристалл выбран правильно. Заголовочный файл подключен правильный.
Создал новый чистый проект с нуля (естественно со старыми *.с и *.h файлами). Та же *опа!
Перепроверил файлы описания процессора ddf и т.п. Все соответствует datasheet'у.
Расставил IE1 |= URXIE0 в нескольких местах, даже по несколько раз подряд. Естественно часть из них компилятор выкинул, но тем не менее.
Сработала конструкция
Код
InitDevice();
IE1 |= URXIE0;

В InitDevice() происходит инициализация всего "железа". Раньше все IE1 |= URXIE0 располагались в разных местах InitDevice(). В этой функции ни один IE1 |= URXIE0 не сработал (проверял по листингу компилятор их оставил, debugger их выполнил, но они не сработало). А вот после выхода из функции на первом же IE1 |= URXIE0 бит установился!
Подумал, глюк камня. Собрал еще одно устройство с новым камнем. И опять *опа! Работает только после InitDevice().
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 9 2008, 22:39
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А без отладчика проверять не пробовали? Загрузить прошивку, отключить JTAG и помигать светодиодом в случае успешной или неуспешной инициализации? А то чудеса какие-то рассказываете. Если в программе команда такая есть, то она не может не выполняться!
Кстати, я ни разу не встречал чтобы команды, оперирующие с SFR (IEx, IFGx, MEx) компилятор "выкидывал". Даже при самом высочайшем уровне оптимизации. Что-то явно не то в консерватории у вас. laughing.gif
Цитата(shasik)
Расставил IE1 |= URXIE0 в нескольких местах, даже по несколько раз подряд. Естественно часть из них компилятор выкинул, но тем не менее

P.S. ради любопытства, попробуйте скомпилировать этот же проект в предыдущей версии IAR. Например, в 3.30. Скачать можно на местном ФТП.
Go to the top of the page
 
+Quote Post
shasik
сообщение Feb 10 2008, 04:45
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 3-09-05
Из: Беларусь, Новополоцк
Пользователь №: 8 188



Цитата(rezident @ Feb 10 2008, 00:39) *
А без отладчика проверять не пробовали? Загрузить прошивку, отключить JTAG и помигать светодиодом в случае успешной или неуспешной инициализации?

Если прерывание сработает, то устройство выплюнет ответ. Если запустить без всяких танцев с бубном, то можно сколько угодно пихать данные - ответа нет.
Запускаем через JTAG. Устанавливаем бит вручную. Вообще отлючаем JTAG - устройство работает как надо (принимает и передает).
Цитата(rezident @ Feb 10 2008, 00:39) *
Если в программе команда такая есть, то она не может не выполняться!

Если бы я в этом сомневался, то не стал бы поднимать вопрос. Сам знаю что должна. Но нет. Точно говорю - если команда стоит в теле функции InitDevice - бит не выставляется. Больше обращений к IE1 в этой функции нет (говорю, это на всякий случай, предвосхищая возможные вопросы).

Цитата(rezident @ Feb 10 2008, 00:39) *
Кстати, я ни разу не встречал чтобы команды, оперирующие с SFR (IEx, IFGx, MEx) компилятор "выкидывал".

Небольшая путаница. Посмотрел листинг, действительно все строки на месте, а вот в окне дизассемблера, когда идет пошаговое выполнение вот там почему-то не все строки стоят. Проверил, это точно!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 10 2008, 10:10
Сообщение #8


Гуру
******

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



Цитата(shasik @ Feb 10 2008, 00:16) *
Работает только после InitDevice().
Возможно не в тему, но теплятся какие-то обрывочные воспоминания, что какие-то из настроек не записывалисть в USART до его включения в MEx. Возможно на разрешение прерываний это тоже влияет.


--------------------
На любой вопрос даю любой ответ
"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
rezident
сообщение Feb 10 2008, 11:35
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(shasik @ Feb 10 2008, 09:45) *
Если прерывание сработает, то устройство выплюнет ответ.
Результат "плевания ответа" зависит не от одного лишь бита в IE, не так ли? Вы бы приаттачили исходник, может чего путного и посоветовали бы тут.
В факт, что C-CPY может глючить и что-то не так показывать, я могу поверить, а вот в то, что не выполняется линейный код подобной программы уже прошитый в кристалл - извините, нет.
Go to the top of the page
 
+Quote Post
shasik
сообщение Feb 11 2008, 06:25
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 3-09-05
Из: Беларусь, Новополоцк
Пользователь №: 8 188



Цитата(rezident @ Feb 10 2008, 13:35) *
Результат "плевания ответа" зависит не от одного лишь бита в IE, не так ли?

Выходит, что зависит. К устройству по UART'у подключено другое, которое постоянно пихает в него данные. Если бит не установился, но активность наблюдаю только на одном проводе (RX для MSP). Если же бит установился, то вижу осциллографом "красоту" уже по двум каналам.

Цитата(rezident @ Feb 10 2008, 13:35) *
В факт, что C-CPY может глючить и что-то не так показывать, я могу поверить, а вот в то, что не выполняется линейный код подобной программы уже прошитый в кристалл - извините, нет.

Урок в грузинской школе.
Учительница: Гоги, дакажи тэарему
Гоги: Мамай, клянусь
....
Реальность такая: программа прошита, галочка Verify Download стоит, в листинге команда присутствует, а дит не устанавливается (вставил еще пару строк, которые анализируют состояние бита и выставляют 0/1 на одной из ног процесора - бит не устанавливается). Я не говорю, что команда не выполняется, я говорю, что она не делает того, что ожидается.

Цитата(rezident @ Feb 10 2008, 13:35) *
Вы бы приаттачили исходник, может чего путного и посоветовали бы тут.

Если честно, то немного стесняюсь. Уж слишком Вы гуру в MSP430. Достаточно посмотреть на количество Ваших постов, да и топики очень часто заканчиваются именно Вашим ответом. Стремно, а вдруг обсмеете
Go to the top of the page
 
+Quote Post
Kurt
сообщение Feb 11 2008, 07:07
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 16-06-04
Из: Россия, Уфа
Пользователь №: 31



Флаг URXIE0 может сбрасываться установленным битом SWRST. Ошибка явно в коде и алгоритме, а не в вышеприведнной строке: IE1 |= URXIE0;
Один из примеров работы с UART http://kurt.embedders.org/wiki/sources:uart1
Go to the top of the page
 
+Quote Post
VAI
сообщение Feb 11 2008, 08:33
Сообщение #12


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



http://electronix.ru/forum/index.php?showt...24037&hl=6#
по ссылке я давал исходники из рабочего проекта
Цитата
Стремно, а вдруг обсмеете

если так действовать, то можно навсегда девственником остаться. :-)


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 11 2008, 08:43
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Kurt @ Feb 11 2008, 12:07) *
Флаг URXIE0 может сбрасываться установленным битом SWRST.
Кстати, да!

shasik, внимательно прочитайте рекомендованный порядок инициализации UART в разделе 17.2.1 USART Initialization and Reset из MSP430x4xx Family User's Guide (Rev. G)-slau056g.pdf. Или вот на gaw.ru в переводе из другого руковдства http://www.gaw.ru/html.cgi/txt/doc/micros/msp430/arh/13.htm
P.S. это настолько очевидно, что мне даже в голову не приходило, что вы не соблюдаете требуемый порядок инициализации регистров USART, игнорируя или невнимательно прочитав соответствующий раздел в User's Guide. cranky.gif А без листинга исходника непонятно зачем вы там вне процедуры инициализации запрещаете/разрешаете прерывания UART - то ли с RS485 работаете, то ли с локальным эхом боритесь? Хотя бы саму процедурку InitDevice() опубликовали.
P.P.S. на количество сообщений не обращайте внимания wink.gif Я отнюдь не гуру, я сам постоянно учусь.
Go to the top of the page
 
+Quote Post
shasik
сообщение Feb 11 2008, 10:24
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 3-09-05
Из: Беларусь, Новополоцк
Пользователь №: 8 188



Первым догадался Сергей Борщ: если установлен бит SWRST в UCTLx, установка бита URXIEx в IEx не работает.
Логика такой последовательности, в принципе понятна. Уж не знаю, что меня толкнуло сделать в этот раз "немного" не так, как делаю обычно. Написал все по памяти, а с мануалом не сверился.
Раньше не наступал на эти грабли, строго следовал последовательности инициализации UART'a, приведенной в User Guide. А вот сделал "небольшое" отступление и получил "Failure to follow this process may result in unpredictable USART behavior."

Все большое спасибо!
Извините за причиненное беспокойство и потраченное на мою невнимательность время. Ужасно стыдно, что поднял бучу в стакане воды. Я, конечно, оправдываю себя, мол, пятница была. "Им бы пятницы взять и отменить". Но, если уж совсем начистоту: затупил. Думаю можно закрывать тему.

Хотя теперь появилось что-то новенькое: программа линкуется, но перестал стабильно запускаться отладчик (и simulator, и debugger). Переустановка IAR'a проблему не решила. Такое происходит только с этим проектом, с остальными все в порядке. Сейчас исполняю такой танец: изменяю туда-сюда уровень оптимизации - запускается в 75 % случаев, добавляешь/удаляешь несколько строк кода - 15%, включаешь/отключаешь генерацию листинга - остальное. А пару раз linker неожиданно выдал, что не смог найти точку входа в программу, станцевал по схеме - все нашел. Проверился на вирусы - все чисто. Теперь вот думаю сходить к психиатру, потому что так глючить может только самое слабое звено, а именно - человек.
ЗЫ. Подобные интересности уже не раздражают, вызывают лишь улыбку и огромное удовольствие, когда на неожиданный каприз PC, ты отвежаешь ему еще более непредсказуемыми действиями, и понимаешь, что ты опять победил.

Цитата(VAI @ Feb 11 2008, 10:33) *
если так действовать, то можно навсегда девственником остаться. :-)

Не знаю уж какой "тайный" смысл скрывается под подобными выражениями wink.gif
Но Вряд ли мне это, грозит.
На С у меня уже 8 лет практики, с MSP гораздо меньше. Тем не менее, не очень я люблю показывать свои программы целиком. В личку мылом - могу. А на всеобщее обозрение могу дать посмотреть только конкретные вещи, вроде инициализации, математики и др. А целиком - нет. Наверное, я жмот!

Цитата(rezident @ Feb 11 2008, 10:43) *
непонятно зачем вы там вне процедуры инициализации запрещаете/разрешаете прерывания UART

Первоначально, разрешение прерывания было одно. А все остальное - лишь попытка заставить "работать".
Go to the top of the page
 
+Quote Post
VAI
сообщение Feb 11 2008, 12:41
Сообщение #15


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Ключевое слово
Цитата
догадался
.
Никто Вас не заставляет выкладывать весь проект, сделайте тестовый проект, чтоб там была эта ошибка и выкладывайте.
Цитата
Хотя теперь появилось что-то новенькое

Попробуйте заново создать проект с Вашими исходниками...


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post

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

 


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


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