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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Странности у Atmega88PA
alik_tv
сообщение Feb 7 2014, 14:36
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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] - для короткого!!!
Go to the top of the page
 
+Quote Post
coolbassnik
сообщение Feb 7 2014, 14:53
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 22-10-10
Из: Украина
Пользователь №: 60 348



Попробуйте static и/или volatile

Сообщение отредактировал coolbassnik - Feb 7 2014, 14:54
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 7 2014, 15:08
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
alik_tv
сообщение Feb 7 2014, 15:55
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 7 2014, 19:52
Сообщение #5


Гуру
******

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



Цитата(alik_tv @ Feb 7 2014, 16:36) *
Каждый раз одно и тоже, ucCurChanel_lpctr обнуляется.
Собаку отключите sm.gif


--------------------
На любой вопрос даю любой ответ
"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
alik_tv
сообщение Feb 7 2014, 20:11
Сообщение #6


Участник
*

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



Цитата(Сергей Борщ @ Feb 7 2014, 22:52) *
Собаку отключите sm.gif

не угадали, отключена. Фьюзы смотрел, стоит такая же красивая галочка как
и у CKDIV8.
Go to the top of the page
 
+Quote Post
San_75
сообщение Feb 8 2014, 01:31
Сообщение #7


Участник
*

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



volatile unsigned char ucCurChanel;
volatile unsigned char btPIN;
volatile unsigned char ucCurChanel_lpctr;
так попробуйте
ucCurChanel_lpctr нигде не инициализируется
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 8 2014, 01:55
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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;
так попробуйте
Нет, не надо так пробовать (а то вдруг заработает sm.gif - так и не поймёте тогда в чём дело было).

Цитата(San_75 @ Feb 8 2014, 03:31) *
ucCurChanel_lpctr нигде не инициализируется
Инициализируется - в стартапе.

Цитата(alik_tv @ Feb 7 2014, 22:11) *
не угадали, отключена. Фьюзы смотрел, стоит такая же красивая галочка как
и у CKDIV8.
Такая же - это в смысле никакой нет? В какой программе смотрите? Каждая же по-своему показывает.
Go to the top of the page
 
+Quote Post
alik_tv
сообщение Feb 8 2014, 13:40
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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. Именно потому, что каждая программа показывает по разному, я сравниваю с состоянием
фьюза, состояние которого заранее мне известно и мною контролируется.
Иначе, сами понимаете, у меня все частоты "поплывут" в программе.

даю картинку
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 8 2014, 14:08
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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

ЗЫ Watchdog-то включен похоже...sm.gif Сергей Борщ был скорей всего прав.
Go to the top of the page
 
+Quote Post
alik_tv
сообщение Feb 8 2014, 14:34
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 8 2014, 15:22
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 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?
Go to the top of the page
 
+Quote Post
alik_tv
сообщение Feb 8 2014, 15:51
Сообщение #13


Участник
*

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



Цитата(_Артём_ @ Feb 8 2014, 18:22) *
А где значения-то? Числа в смысле? Галочки - это не числа.

То есть у uniprof всё через...наоборот?
Да откуда мы можем знать чем вы программируете? Parallel programming?


Вопрос хороший, но как выдрать числа я не знаю. Я достаточно давно работаю
с этой программой и, в общем, ей доверяю.

Ну, да, можно сказать наоборот.
Это, в некотором смысле, просто инверсная логика, не так уж и сложно привыкнуть.

Точно вы не знаете, но можно догадаться, я же сказал "обычно".
В общем, не собака это, что-то другое.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 10 2014, 07:10
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
alik_tv
сообщение Feb 10 2014, 10:46
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post

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

 


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


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