Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Споткнулся на IE1 в MSP430F449
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
shasik
Почему не работает код:
Код
IE1 |= URXIE0;

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


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

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

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

Расставил IE1 |= URXIE0 в разных местах - бит из программы не устанавливается.
rezident
Цитата(shasik @ Feb 8 2008, 15:46) *
Расставил IE1 |= URXIE0 в разных местах - бит из программы не устанавливается.
Странно это. Буквально неделю назад корректировал проект в котором UART используется. Проект был создан еще в версии 3.30, а правил я его в версии 4.10. Как ни странно UART0 работает, именно по прерываниям. Проект корректировал так, чтобы его можно было использовать в трех модификациях устройства. В них используются MSP430F149, MSP430F1232 и MSP430F135 соответственно. Если для первого и третьего никаких отличий в программировании нет, то для второго кристалла отличия имеются. У него флаги разрешения прерываний и флаги запроса прерываний для UART0 в других регистрах располагаются, в IE2 и IFG2 соответственно. Тем не менее, оба варианта проекта скомпилировались и прошивки работают в железе.
P.S. проверьте правильно ли выбран кристалл в опциях проекта и тот ли заголовочный файл с описанием регистров вы подключаете?
shasik
Цитата(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().
rezident
А без отладчика проверять не пробовали? Загрузить прошивку, отключить JTAG и помигать светодиодом в случае успешной или неуспешной инициализации? А то чудеса какие-то рассказываете. Если в программе команда такая есть, то она не может не выполняться!
Кстати, я ни разу не встречал чтобы команды, оперирующие с SFR (IEx, IFGx, MEx) компилятор "выкидывал". Даже при самом высочайшем уровне оптимизации. Что-то явно не то в консерватории у вас. laughing.gif
Цитата(shasik)
Расставил IE1 |= URXIE0 в нескольких местах, даже по несколько раз подряд. Естественно часть из них компилятор выкинул, но тем не менее

P.S. ради любопытства, попробуйте скомпилировать этот же проект в предыдущей версии IAR. Например, в 3.30. Скачать можно на местном ФТП.
shasik
Цитата(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) компилятор "выкидывал".

Небольшая путаница. Посмотрел листинг, действительно все строки на месте, а вот в окне дизассемблера, когда идет пошаговое выполнение вот там почему-то не все строки стоят. Проверил, это точно!
Сергей Борщ
Цитата(shasik @ Feb 10 2008, 00:16) *
Работает только после InitDevice().
Возможно не в тему, но теплятся какие-то обрывочные воспоминания, что какие-то из настроек не записывалисть в USART до его включения в MEx. Возможно на разрешение прерываний это тоже влияет.
rezident
Цитата(shasik @ Feb 10 2008, 09:45) *
Если прерывание сработает, то устройство выплюнет ответ.
Результат "плевания ответа" зависит не от одного лишь бита в IE, не так ли? Вы бы приаттачили исходник, может чего путного и посоветовали бы тут.
В факт, что C-CPY может глючить и что-то не так показывать, я могу поверить, а вот в то, что не выполняется линейный код подобной программы уже прошитый в кристалл - извините, нет.
shasik
Цитата(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. Достаточно посмотреть на количество Ваших постов, да и топики очень часто заканчиваются именно Вашим ответом. Стремно, а вдруг обсмеете
Kurt
Флаг URXIE0 может сбрасываться установленным битом SWRST. Ошибка явно в коде и алгоритме, а не в вышеприведнной строке: IE1 |= URXIE0;
Один из примеров работы с UART http://kurt.embedders.org/wiki/sources:uart1
VAI
http://electronix.ru/forum/index.php?showt...24037&hl=6#
по ссылке я давал исходники из рабочего проекта
Цитата
Стремно, а вдруг обсмеете

если так действовать, то можно навсегда девственником остаться. :-)
rezident
Цитата(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 Я отнюдь не гуру, я сам постоянно учусь.
shasik
Первым догадался Сергей Борщ: если установлен бит 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

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

Попробуйте заново создать проект с Вашими исходниками...
shasik
Цитата(VAI @ Feb 11 2008, 14:41) *
Попробуйте заново создать проект с Вашими исходниками...


Делал. Стабильного пуска нет: один раз после создания нового проекта отладчик запустился сразу, а в следующий раз - запустился только после шаманства.
jorikdima
сталкивался с этой особенностью. Тоже пару часов убил. Если память не изменяет, у меня даже вручную принудительно в дебаггере не выставлялся этот бит.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.