|
|
  |
чудеса с mps430f2121 |
|
|
|
Nov 3 2007, 22:29
|
Знающий
   
Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960

|
Случайно обнаружил странное поведение чипа, или не чипа а не знаю кого... Программа опроса кнопки на порту P1.4, все просто как грабли (LocBtn - статическая переменная, которая потом анализируется) Код LocBtn<<=1; LocBtn&=~1; if ((P1IN & (1<<p1key))!=0) { LocBtn|=1; } Железка подключена по jtag через LPT-FET. Компилирую, запускаю C-SPY, давлю F5 (GO), кнопка опрашивается как и задумано. jtag стоит в режиме Release JTAG on GO. Отключаю отладчик, подключаю БП, все работает, но "0" на порту P1.4 программа в упор не видит. Контролирую осциллографом - на ножке ноль. Подключаю обратно отладчик, не меняя прошивки - кнопка снова работает. Используется IAR 3.42a.
|
|
|
|
|
Nov 3 2007, 22:52
|

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

|
Цитата(_3m @ Nov 4 2007, 00:29)  LocBtn&=~1; Эта команда лишняя. В Си при сдвиге влево в младший бит уже заносится ноль. При сдвиге вправо беззнаковой переменной также заносится ноль, в знаковую заносится копия старшего бита до сдвига. Цитата(_3m @ Nov 4 2007, 00:29)  Отключаю отладчик, подключаю БП, все работает, но "0" на порту P1.4 программа в упор не видит. Возможно ваша проблема кроется в уровне на ножке TEST - отладчик ее ставит в нужное положение, без него там у вас каким-то образом появляется высокий уровень и биты 4...7 переходят в режим JTAG. Поставьте подтяжку 1К к земле - должно помочь.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 3 2007, 23:07
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
В таких случаях неплохо бы давать еще и код инициализации периферии. Ну и проверить в сомнительных случаях, что там компилятор накомпилировал, по асм-овому тексту это вообще святое дело. Цитата(Сергей Борщ @ Nov 4 2007, 03:52)  Поставьте подтяжку 1К к земле - должно помочь. В кристаллах этой серии pull-down на пине TEST встроенный. Цитата RInternal Internal pull-down resistance on TEST 2.2 V/3 V 25 60 90 kΩ ИМХО не в этом дело.
|
|
|
|
|
Nov 3 2007, 23:45
|

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

|
Цитата(rezident @ Nov 4 2007, 01:07)  В кристаллах этой серии pull-down на пине TEST встроенный. Да, я уже сверился с даташитом (помню то обсуждение  ). Но мало ли что там у _3m снаружи подключено - может банально не туда подтянул. Поэтому и написал обтекаемо - "каким-то образом появляется". Пусть проверит, убедится.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 4 2007, 13:55
|
Знающий
   
Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960

|
Цитата(Сергей Борщ @ Nov 4 2007, 01:52)  Эта команда лишняя. В Си при сдвиге влево в младший бит уже заносится ноль. При сдвиге вправо беззнаковой переменной также заносится ноль, в знаковую заносится копия старшего бита до сдвига. Проверю по ассемблерному листингу. Я стараюсь как можно меньше полагаться на "стандарты" языка и умолчания компилятора, так как на максимальном уровне оптимизации из-за этого возникают трудновыявляемые компиляторозависимые баги. Цитата Возможно ваша проблема кроется в уровне на ножке TEST - отладчик ее ставит в нужное положение, без него там у вас каким-то образом появляется высокий уровень и биты 4...7 переходят в режим JTAG. Поставьте подтяжку 1К к земле - должно помочь. Запаяна подтяжка 10К к земле, на ножке TEST присутствует логический ноль. Я вставил выдачу отладочных импульсов на P1.4 - оно на вывод работает. Возможно C-SPY при старте что-то инициализирует, что в моей программе не инициализируется, однако я точно инициализирую регистры PxDIR, PxSEL, PxREN, PxIES, PxIE, PxOUT, где x=1...2
|
|
|
|
|
Nov 4 2007, 16:50
|

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

|
Цитата(_3m @ Nov 4 2007, 15:55)  Проверю по ассемблерному листингу. Я стараюсь как можно меньше полагаться на "стандарты" языка и умолчания компилятора Это правильно. Заодно проверьте, что A <<=1 сдвигает именно влево и именно на один бит и при всех уровнях оптимизации. Цитата(_3m @ Nov 4 2007, 15:55)  , так как на максимальном уровне оптимизации из-за этого возникают трудновыявляемые компиляторозависимые баги. У меня не возникают. Видимо потому, что ознакамливаюсь со стандартами (без кавычек) и описаниями. В следующий раз, когда найдете такой - не забудьте поделиться. Заодно узнаю, что я делаю неправильно. Цитата(_3m @ Nov 4 2007, 15:55)  Я вставил выдачу отладочных импульсов на P1.4 - оно на вывод работает. Возможно C-SPY при старте что-то инициализирует, что в моей программе не инициализируется, однако я точно инициализирую регистры PxDIR, PxSEL, PxREN, PxIES, PxIE, PxOUT, где x=1...2 "Оно само" ничего не делает. C-SPY пишет в регистры при старте то, что указано ему в .mac-файле. Файл указывается в опциях проекта на вкладке дебаггера. Про этот файл тоже написано в документации. rezident прав - телепатить непросто.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|