|
Споткнулся на IE1 в MSP430F449 |
|
|
|
Feb 8 2008, 10:09
|

Местный
  
Группа: Свой
Сообщений: 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. Что я пропустил?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Feb 8 2008, 10:46
|

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

|
Цитата(rezident @ Feb 8 2008, 12:18)  Что значит "не работает"? Команда BIS.B #0x40, &0x0 не выполняется или UART не работает? Дебаггером в железе смотрите или в симуляторе пытаетесь отлаживать? Дебаггером в железе смотрю. UART работает, а вот прерывание срабатывает только, если установить URXIE0 вручную. Т.е. запускаю железку., останавливаю выполнение, устанавливаю бит, запускаю продолжение выполнения - все прерывание срабатывает. Расставил IE1 |= URXIE0 в разных местах - бит из программы не устанавливается.
|
|
|
|
|
Feb 9 2008, 22:16
|

Местный
  
Группа: Свой
Сообщений: 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().
|
|
|
|
|
Feb 9 2008, 22:39
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
А без отладчика проверять не пробовали? Загрузить прошивку, отключить JTAG и помигать светодиодом в случае успешной или неуспешной инициализации? А то чудеса какие-то рассказываете. Если в программе команда такая есть, то она не может не выполняться! Кстати, я ни разу не встречал чтобы команды, оперирующие с SFR (IEx, IFGx, MEx) компилятор "выкидывал". Даже при самом высочайшем уровне оптимизации. Что-то явно не то в консерватории у вас. Цитата(shasik) Расставил IE1 |= URXIE0 в нескольких местах, даже по несколько раз подряд. Естественно часть из них компилятор выкинул, но тем не менее P.S. ради любопытства, попробуйте скомпилировать этот же проект в предыдущей версии IAR. Например, в 3.30. Скачать можно на местном ФТП.
|
|
|
|
|
Feb 10 2008, 04:45
|

Местный
  
Группа: Свой
Сообщений: 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) компилятор "выкидывал". Небольшая путаница. Посмотрел листинг, действительно все строки на месте, а вот в окне дизассемблера, когда идет пошаговое выполнение вот там почему-то не все строки стоят. Проверил, это точно!
|
|
|
|
|
Feb 10 2008, 11:35
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(shasik @ Feb 10 2008, 09:45)  Если прерывание сработает, то устройство выплюнет ответ. Результат "плевания ответа" зависит не от одного лишь бита в IE, не так ли? Вы бы приаттачили исходник, может чего путного и посоветовали бы тут. В факт, что C-CPY может глючить и что-то не так показывать, я могу поверить, а вот в то, что не выполняется линейный код подобной программы уже прошитый в кристалл - извините, нет.
|
|
|
|
|
Feb 11 2008, 06:25
|

Местный
  
Группа: Свой
Сообщений: 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. Достаточно посмотреть на количество Ваших постов, да и топики очень часто заканчиваются именно Вашим ответом. Стремно, а вдруг обсмеете
|
|
|
|
|
Feb 11 2008, 07:07
|
Участник

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

|
Флаг URXIE0 может сбрасываться установленным битом SWRST. Ошибка явно в коде и алгоритме, а не в вышеприведнной строке: IE1 |= URXIE0; Один из примеров работы с UART http://kurt.embedders.org/wiki/sources:uart1
|
|
|
|
|
Feb 11 2008, 08:33
|

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

|
http://electronix.ru/forum/index.php?showt...24037&hl=6#по ссылке я давал исходники из рабочего проекта Цитата Стремно, а вдруг обсмеете если так действовать, то можно навсегда девственником остаться. :-)
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Feb 11 2008, 08:43
|
Гуру
     
Группа: Свой
Сообщений: 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.htmP.S. это настолько очевидно, что мне даже в голову не приходило, что вы не соблюдаете требуемый порядок инициализации регистров USART, игнорируя или невнимательно прочитав соответствующий раздел в User's Guide.  А без листинга исходника непонятно зачем вы там вне процедуры инициализации запрещаете/разрешаете прерывания UART - то ли с RS485 работаете, то ли с локальным эхом боритесь? Хотя бы саму процедурку InitDevice() опубликовали. P.P.S. на количество сообщений не обращайте внимания  Я отнюдь не гуру, я сам постоянно учусь.
|
|
|
|
|
Feb 11 2008, 10:24
|

Местный
  
Группа: Свой
Сообщений: 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)  если так действовать, то можно навсегда девственником остаться. :-) Не знаю уж какой "тайный" смысл скрывается под подобными выражениями  Но Вряд ли мне это, грозит. На С у меня уже 8 лет практики, с MSP гораздо меньше. Тем не менее, не очень я люблю показывать свои программы целиком. В личку мылом - могу. А на всеобщее обозрение могу дать посмотреть только конкретные вещи, вроде инициализации, математики и др. А целиком - нет. Наверное, я жмот! Цитата(rezident @ Feb 11 2008, 10:43)  непонятно зачем вы там вне процедуры инициализации запрещаете/разрешаете прерывания UART Первоначально, разрешение прерывания было одно. А все остальное - лишь попытка заставить "работать".
|
|
|
|
|
Feb 11 2008, 12:41
|

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

|
Ключевое слово Цитата догадался . Никто Вас не заставляет выкладывать весь проект, сделайте тестовый проект, чтоб там была эта ошибка и выкладывайте. Цитата Хотя теперь появилось что-то новенькое Попробуйте заново создать проект с Вашими исходниками...
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|