Привет всем
Вот программа:
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] - для короткого!!!