|
Странности у 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 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
|
|
|
|
|
Feb 10 2014, 11:45
|

Частый гость
 
Группа: Свой
Сообщений: 176
Регистрация: 2-04-08
Из: Днепропетровск
Пользователь №: 36 406

|
AVcc подключен к питанию? Да, и еще. Блокировочные конденсаторы установлены? 88PA - отличная рабочая лошадка была когда-то. А попробуйте залить мой вариант.
Прикрепленные файлы
alik.zip ( 378 байт )
Кол-во скачиваний: 13
--------------------
Ребята, как же это вы без гравицапы пепелац выкатываете из гаража? Это непорядок. ©
|
|
|
|
|
Feb 10 2014, 21:10
|
Участник

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

|
Цитата(delamoure @ Feb 10 2014, 15:45)  AVcc подключен к питанию? Да, и еще. Блокировочные конденсаторы установлены?
88PA - отличная рабочая лошадка была когда-то. А попробуйте залить мой вариант. AVcc - подключен. Блокировочные конденсаторы с двух сторон, На картинке обозначены синими "с".
В паре 1мкФ и 0.1мкФ. На основной плате пара 10мкФ и 0.1мкФ. Залил, ничего не поменялось. Светодиод загорается при нажатии кнопки. Если кондер разряжается через резистор, то светодиод не загорается.
|
|
|
|
|
Feb 11 2014, 09:07
|

Частый гость
 
Группа: Свой
Сообщений: 176
Регистрация: 2-04-08
Из: Днепропетровск
Пользователь №: 36 406

|
Цитата(alik_tv @ Feb 10 2014, 23:10)  Залил, ничего не поменялось. Светодиод загорается при нажатии кнопки. Если кондер разряжается через резистор, то светодиод не загорается. День добрый. Я вашу программу скомпилировал в WinAVR-20100110 без оптимизаций, ее вы и "заливали". Еще интересно fuses посмотеть, но лень разбираться с вашим программатором. Hex значения fuses оценили бы все, кто хочет вам помочь здесь. R16 на вашей плате подключен к reset? Полностью опишите подключение этого вывода, ну или дайте jpeg платы. Если это Orcad, можно и оригинал.
--------------------
Ребята, как же это вы без гравицапы пепелац выкатываете из гаража? Это непорядок. ©
|
|
|
|
|
Feb 11 2014, 14:45
|
Участник

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

|
Цитата(delamoure @ Feb 11 2014, 13:07)  . через R16 reset подключен к программатору. Hex значение fuses - есть пару мыслей может выйдет. Но зачем фьюзы, вы про WDT? MCUSR показывает, что не собака это. Может кто подскажет для такой версии схемы программатора есть ПО кроме uniprof?  Проверил с avrdude не нашел в ее списке такого программатора.
Сообщение отредактировал alik_tv - Feb 11 2014, 21:17
Причина редактирования: избыточное цитирование
|
|
|
|
Сообщений в этой теме
alik_tv Странности у Atmega88PA Feb 7 2014, 14:36 coolbassnik Попробуйте static и/или volatile Feb 7 2014, 14:53 Палыч Цитата(alik_tv @ Feb 7 2014, 18:36) При з... Feb 7 2014, 15:08 alik_tv Цитата(Палыч @ Feb 7 2014, 18:08) Э-э-э-э... Feb 7 2014, 15:55 Сергей Борщ Цитата(alik_tv @ Feb 7 2014, 16:36) Кажды... Feb 7 2014, 19:52 alik_tv Цитата(Сергей Борщ @ Feb 7 2014, 22:52) С... Feb 7 2014, 20:11 San_75 volatile unsigned char ucCurChanel;
volatile unsig... Feb 8 2014, 01:31 _Артём_ Цитата(San_75 @ Feb 8 2014, 03:31) volati... Feb 8 2014, 01:55 alik_tv Цитата(San_75 @ Feb 8 2014, 04:31) volati... Feb 8 2014, 13:40  _Артём_ Цитата(alik_tv @ Feb 8 2014, 15:40) я сра... Feb 8 2014, 14:08   alik_tv Цитата(_Артём_ @ Feb 8 2014, 17:08) Вообщ... Feb 8 2014, 14:34    _Артём_ Цитата(alik_tv @ Feb 8 2014, 16:34) Боюсь... Feb 8 2014, 15:22     alik_tv Цитата(_Артём_ @ Feb 8 2014, 18:22) А где... Feb 8 2014, 15:51 delamoure То есть RESET - это длинная линия, которая подключ... Feb 11 2014, 21:11 alik_tv Я отключаю программатор перед проверкой схемы. Эта... Feb 11 2014, 21:35  Сергей Борщ Цитата(alik_tv @ Feb 11 2014, 23:35) Я от... Feb 12 2014, 07:11   alik_tv Цитата(Сергей Борщ @ Feb 12 2014, 10:11) ... Feb 12 2014, 09:56    Сергей Борщ Цитата(alik_tv @ Feb 12 2014, 11:56) легк... Feb 12 2014, 10:08     alik_tv Не через всю плату, тут вы загнули. Сразу за резис... Feb 12 2014, 13:21 delamoure OK.
alik, предлагаю выложить здесь схему и плату в... Feb 12 2014, 22:54 alik_tv схема
плата в файле.
Чего на схеме нет, и на плат... Feb 13 2014, 06:03  delamoure alik, извините за задержку с ответом.
Принципиальн... Feb 24 2014, 11:16
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|