|
Странности у Atmega88PA |
|
|
|
Feb 7 2014, 14:36
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-01-06
Пользователь №: 12 859

|
Привет всем Вот программа: CODE #include <ioavr.h> #include <inavr.h>
unsigned char ucCurChanel; unsigned char btPIN; unsigned char ucCurChanel_lpctr;
#define BUTTON_MASK_PORTC 0x04
#define SIGNAL_LS_STATE_ON PORTB |= 0x10; #define SIGNAL_LS_STATE_OFF PORTB &= ~0x10;
void main(void) { // Port B DDRB = 0x10; PORTB = 0x00;
// Port C DDRC = 0x00; PORTC = 0x00;
ucCurChanel = 2; while(1) { btPIN = (PINC & BUTTON_MASK_PORTC);
if (btPIN == 0) { if (ucCurChanel_lpctr == 0) { SIGNAL_LS_STATE_ON } } else { ucCurChanel_lpctr = ucCurChanel; SIGNAL_LS_STATE_OFF } } } На один пин порта С навешена кнопка. Резистор на питание, конденсатор на землю. Их общая точка через кнопку сидит на земле. На пине порта В транзистор НПН с светодиодом в коллекторе. Программа проверялась на эмуляторе АВР студии 4.18. Все работает как и должно быть. При запуске переменная ucCurChanel_lpctr получает значение 2 и при нажатии на кнопку светодиод НЕ включается. Откомпилировал ее на ИАР АВР 4.3 и 5x. Загрузил в проц. В проце при каждом нажатии кнопки включается светодиод. При отпускании отключается. Оптимизация отключена. Выводил значение переменной ucCurChanel_lpctr по компорту в ПК. При нажатии кнопки значение _обнуляется_. А значение переменной ucCurChanel не зависит от состояния кнопки. Все переменные глобальные. вывел листинг, ничего странного не нашел. Вот основная часть его CODE RSEG CODE:CODE:NOROOT(1) // 15 void main(void) main: CFI Block cfiBlock0 Using cfiCommon0 CFI Function main // 16 { // 17 // Port B // 18 DDRB = 0x10; LDI R16, 16 OUT 0x04, R16 // 19 PORTB = 0x00; LDI R16, 0 OUT 0x05, R16 // 20 // 21 // Port C // 22 DDRC = 0x00; LDI R16, 0 OUT 0x07, R16 // 23 PORTC = 0x00; LDI R16, 0 OUT 0x08, R16 // 24 // 25 ucCurChanel = 2; LDI R16, 2 STS ucCurChanel, R16 // 26 // 27 while(1) // 28 { // 29 btPIN = (PINC & BUTTON_MASK_PORTC); ??main_0: IN R16, 0x06 ANDI R16, 0x04 STS btPIN, R16 // 30 // 31 if (btPIN == 0) LDS R16, btPIN TST R16 BRNE ??main_1 // 32 { // 33 if (ucCurChanel_lpctr == 0) LDS R16, ucCurChanel_lpctr TST R16 BRNE ??main_0 // 34 { // 35 SIGNAL_LS_STATE_ON SBI 0x05, 0x04 RJMP ??main_0 // 36 } // 37 } // 38 else // 39 { // 40 ucCurChanel_lpctr = ucCurChanel; ??main_1: LDS R16, ucCurChanel STS ucCurChanel_lpctr, R16 // 41 SIGNAL_LS_STATE_OFF CBI 0x05, 0x04 RJMP ??main_0 CFI EndBlock cfiBlock0 REQUIRE _A_PORTC REQUIRE _A_DDRC REQUIRE _A_PINC REQUIRE _A_PORTB REQUIRE _A_DDRB // 42 } // 43 }// end while // 44 // 45 }// end main К сожалению у меня нет внутрисхемного отладчика, не могу словить где переменная ucCurChanel_lpctr обнуляется. Если кому не влом и все под руками, проверьте где тут грабли. Я уже не знаю, что делать, может быть это у меня с головой ... 0) Я перепроверил все с десяток раз, при различном коде. Каждый раз одно и тоже, ucCurChanel_lpctr обнуляется. Собрал еще одно устройство, с другим экземляром 88РА. Все также. Одна сплошная грабля. Ткаченко Олег
Сообщение отредактировал alik_tv - Feb 8 2014, 13:44
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Feb 7 2014, 15:08
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(alik_tv @ Feb 7 2014, 18:36)  При запуске переменная ucCurChanel_lpctr получает значение 2 и при нажатии на кнопку светодиод НЕ включается. Э-э-э-э... А, что Вас удивляет? Программа работает в точности так, как она написана! При пуске программы - кнопка не нажата и регистр PINC не равен нулю. Следовательно и btPIN не равен нулю. Условие if(btPIN == 0) не выполняется и переменная ucCurChanel_lpctr принимает не нулевое значение (ucCurChanel_lpctr = ucCurChanel). Позже, когда Вы нажмёте кнопку, зажеться светодиоду мешает невыполнение условия if (ucCurChanel_lpctr == 0). Поскольку в программе переменная ucCurChanel_lpctr принимает значение ноль только при включении питания и тут же программа изменяет его на 2 (см. выше), то светодиоду не зажечься никогда! В симуляторе всё работало, вероятно, потому, что Вы имитировали нажатие кнопки до присвоения переменной ucCurChanel_lpctr значения 2.
|
|
|
|
|
Feb 7 2014, 15:55
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-01-06
Пользователь №: 12 859

|
Цитата(Палыч @ Feb 7 2014, 18:08)  Э-э-э-э... А, что Вас удивляет? Программа работает в точности так, как она написана! При пуске программы - кнопка не нажата и регистр PINC не равен нулю. Следовательно и btPIN не равен нулю. Условие if(btPIN == 0) не выполняется и переменная ucCurChanel_lpctr принимает не нулевое значение (ucCurChanel_lpctr = ucCurChanel). Позже, когда Вы нажмёте кнопку, зажеться светодиоду мешает невыполнение условия if (ucCurChanel_lpctr == 0). Поскольку в программе переменная ucCurChanel_lpctr принимает значение ноль только при включении питания и тут же программа изменяет его на 2 (см. выше), то светодиоду не зажечься никогда! В симуляторе всё работало, вероятно, потому, что Вы имитировали нажатие кнопки до присвоения переменной ucCurChanel_lpctr значения 2. Вы не поняли. Как Вы написали, так она НЕ работает в проце. В этом и грабля. Она работает при ЭМУЛЯЦИИ, как Вы написали. А после прошивки, в реальном устройстве, светодиод включается при нажатии кнопки. ВКЛЮЧАЕТСЯ! Олег Цитата(coolbassnik @ Feb 7 2014, 17:53)  Попробуйте static и/или volatile попробовал. как и ожидалось никаких изменений в ассемблере нет. Прерываний для volatile у меня нет, а static для одного файла кода ни на что не влияет.
Сообщение отредактировал alik_tv - Feb 7 2014, 19:43
|
|
|
|
|
Feb 7 2014, 20:11
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-01-06
Пользователь №: 12 859

|
Цитата(Сергей Борщ @ Feb 7 2014, 22:52)  Собаку отключите  не угадали, отключена. Фьюзы смотрел, стоит такая же красивая галочка как и у CKDIV8.
|
|
|
|
|
Feb 8 2014, 01:31
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 14-03-13
Пользователь №: 76 008

|
volatile unsigned char ucCurChanel; volatile unsigned char btPIN; volatile unsigned char ucCurChanel_lpctr; так попробуйте ucCurChanel_lpctr нигде не инициализируется
|
|
|
|
|
Feb 8 2014, 01:55
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(San_75 @ Feb 8 2014, 03:31)  volatile unsigned char ucCurChanel; volatile unsigned char btPIN; volatile unsigned char ucCurChanel_lpctr; так попробуйте Нет, не надо так пробовать (а то вдруг заработает  - так и не поймёте тогда в чём дело было). Цитата(San_75 @ Feb 8 2014, 03:31)  ucCurChanel_lpctr нигде не инициализируется Инициализируется - в стартапе. Цитата(alik_tv @ Feb 7 2014, 22:11)  не угадали, отключена. Фьюзы смотрел, стоит такая же красивая галочка как и у CKDIV8. Такая же - это в смысле никакой нет? В какой программе смотрите? Каждая же по-своему показывает.
|
|
|
|
|
Feb 8 2014, 13:40
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-01-06
Пользователь №: 12 859

|
Цитата(San_75 @ Feb 8 2014, 04:31)  volatile unsigned char ucCurChanel; volatile unsigned char btPIN; volatile unsigned char ucCurChanel_lpctr; так попробуйте ucCurChanel_lpctr нигде не инициализируется проверил, не помогает. ucCurChanel_lpctr можно считать инициализируется ucCurChanel в цикле. Речь не идет о неправильной работе сразу после перезагрузке, программа постоянно неправильно работает. Ошибка перманентная. Цитата(_Артём_ @ Feb 8 2014, 04:55)  Такая же - это в смысле никакой нет? В какой программе смотрите? Каждая же по-своему показывает. Я работаю с uniprof. Именно потому, что каждая программа показывает по разному, я сравниваю с состоянием фьюза, состояние которого заранее мне известно и мною контролируется. Иначе, сами понимаете, у меня все частоты "поплывут" в программе. даю картинку
|
|
|
|
|
Feb 8 2014, 14:08
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(alik_tv @ Feb 8 2014, 15:40)  я сравниваю с состоянием фьюза, состояние которого заранее мне известно и мною контролируется. Вообще-то фузы - это три байта, которые могут принимать некоторые значения. Вот и вопрос - какие у фузов значения? Цитата(alik_tv @ Feb 8 2014, 15:40)  я сравниваю с состоянием фьюза, состояние которого заранее мне известно и мною контролируется. Что вам известно мы же не знаем. А вот по значениям можно определить как настроен МК. ЗЫ Watchdog-то включен похоже... Сергей Борщ был скорей всего прав.
|
|
|
|
|
Feb 8 2014, 14:34
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-01-06
Пользователь №: 12 859

|
Цитата(_Артём_ @ Feb 8 2014, 17:08)  Вообще-то фузы - это три байта, которые могут принимать некоторые значения. Вот и вопрос - какие у фузов значения? Что вам известно мы же не знаем. А вот по значениям можно определить как настроен МК.
ЗЫ Watchdog-то включен похоже...:) Сергей Борщ был скорей всего прав. Боюсь, что по значениям вы и ошиблись. "Note that the fuses are read as logical zero, “0”, if they are programmed." Но, если вам лень читать документацию, как мне, то можно посмотреть на состояние бита SPIEN и спросить себя, а чем же обычно люди программируют? Да, именно им - Serial Program.
|
|
|
|
|
Feb 8 2014, 15:22
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(alik_tv @ Feb 8 2014, 16:34)  Боюсь, что по значениям вы и ошиблись. А где значения-то? Числа в смысле? Галочки - это не числа. Цитата(alik_tv @ Feb 8 2014, 16:34)  Да, именно им - Serial Program. То есть у uniprof всё через...наоборот? Цитата(alik_tv @ Feb 8 2014, 16:34)  Да, именно им - Serial Program. Да откуда мы можем знать чем вы программируете? Parallel programming?
|
|
|
|
|
Feb 8 2014, 15:51
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-01-06
Пользователь №: 12 859

|
Цитата(_Артём_ @ Feb 8 2014, 18:22)  А где значения-то? Числа в смысле? Галочки - это не числа.
То есть у uniprof всё через...наоборот? Да откуда мы можем знать чем вы программируете? Parallel programming? Вопрос хороший, но как выдрать числа я не знаю. Я достаточно давно работаю с этой программой и, в общем, ей доверяю. Ну, да, можно сказать наоборот. Это, в некотором смысле, просто инверсная логика, не так уж и сложно привыкнуть. Точно вы не знаете, но можно догадаться, я же сказал "обычно". В общем, не собака это, что-то другое.
|
|
|
|
|
Feb 10 2014, 07:10
|

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

|
Ну что, есть прорыв?
"Давайте пойдем логическим путем. Давайте пойдем вместе" (с).
Единственное место, где переменная обнуляется - это startup() при запуске программы. Мы можем предположить, что программа периодически сбрасывается. Проверить это просто при наличии осциллографа. Напишите простейшую программу - настройка портов на вывод 0, задержка несколько миллисекунд, зажигание светодиода, бесконечный цикл. Если осциллограф покажет импульсы на светодиоде - процессор сбрасывается. Или можно посылать один символ в последовательный порт. Если символ будет посылаться постоянно - ну вы поняли.
Сбрасываться процессор может либо собакой, либо уходом в прерывание для которого не прописан обработчик, либо же из-за замыкания в плате при зажигании светодиода лог. 0 поступает на вход RESET процессора. Поскольку программа проста, как трехлинейная винтовка и прерываний в ней не видно, собаку вы отмели, ищите замыкание в цепи сброса.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 10 2014, 10:46
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-01-06
Пользователь №: 12 859

|
Цитата(Сергей Борщ @ Feb 10 2014, 10:10)  Ну что, есть прорыв? Почти есть. При замыкании кнопки разряжается емкость 0.1мкФ на землю без ограничения тока. Срабатывает BOD и RESET. Я это вижу по MCUSR. Не знаю почему, но BORF и PORF устанавливаются вместе. Если я меняю уровень MCUSR с 4.3В на 2.7В ничего не сбрасывается. Если в цепь разряда кондера поставить резюк 300 Ом, то и с включенным BOD, на уровне 4.3В, тоже все работает. И если отключить BOD все нормально. Разводку проверил, мекка по питанию от эликтролита входного. Не сказал бы, что плохо, хоть и сам разводил. :0) Ширина дорожек не менее 0.3мм. Поставил осцик 100Мгц Ригол на питание, включил развертку на спаду. Нажал на кнопку - ничего. Развертки нет. Сейчас вот в голову пришло, что уровень не проверил, не знаю, что там по умолчанию стояло. Но с другой стороны не понятно почему там что-то должно быть. Но я это перепроверю. Плата пока на столе, если есть у кого мысли могу проверить сегодня после 7 вечера. Кстати, на этой плате кроме одной кнопки, проца и светодиода ничего нет. БП импульсный на 2А, если не ошибаюсь. К нему кроме этой платы ничего не подключено. Программатор я отсоединяю при тестировании. Резистор через который заряжается кондер на кнопке 4.7кОм.
Сообщение отредактировал alik_tv - Feb 10 2014, 10:52
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|