Технический форум по робототехнике.
rig » 14 май 2010, 11:55
чувствую себя инквизитором
Lockdog » 14 май 2010, 12:15
В общем, видимо, протеус глючит, потому что сейчас запустил программу в отладчике AVR Studio и там всё работало как надо и через 0,5 сек прерывание обрабатывалось.
Спасибо всем за терпение. =)
rig » 14 май 2010, 12:32
Ну а в железе?
Lockdog » 14 май 2010, 13:25
Сегодня вечером попробую и отпишусь, сейчас железо просто не с собой=)
rig » 15 май 2010, 11:43
что там по железу, работает?
Lockdog » 16 май 2010, 00:12
Не заработало =(
Добавлено спустя 1 час 3 минуты 6 секунд:Странно, но по всей видимости не работает конструкция if {}, потому что я пробовал в прерывании дёргать ногой МК и всё работало
- Код: Выделить всё • Развернуть
#pragma vector = TIMER1_OVF_vect
__interrupt void flashing(void)
{
PORTD ^= (1<<PD0);
}
Но вот если записать так:
- Код: Выделить всё • Развернуть
#pragma vector = TIMER1_OVF_vect
__interrupt void flashing(void)
{
if ((PINC & (1 << PC3)) == 1)
{
TCNT1H=0xF0;
TCNT1L=0x6F;
PORTD ^= (1<<PD0);
}
}
То ничего не работает. DDRC настроен на вход.
rig » 16 май 2010, 07:54
не в прерывании работает?
давай схему конструкции.
PD0,PC3 где инициализированы?
пробуй заменить на цыфры.
С ножками все впорядке? С первой страницы фигурируют нулевые ножки а тут уже третья вход и нулевая выход
Lockdog » 16 май 2010, 11:10
Не в прерывании тоже не работает.
PC3, PD0 описаны в хедере iom8.h
С ножками всё в порядке, пробовал менять и на цифры, причём в кодвижн if работает.
Входные ноги PC3-PC5
Выходные PD0-PD2
Так что не играет роли с чего снимать и на что выводить =)
Добавлено спустя 38 минут 48 секунд:Бред =)
Записал так:
- Код: Выделить всё • Развернуть
{
if ((PINC & (1 << PC3)) != 0)
{
TCNT1H=0xF0;
TCNT1L=0x6F;
PORTD = (1<<PD0);
}
и всё заработало. =)
В общем если у кого-то будет похожая проблема, то в IAR нужно проверять не на равенство лог.1, а на
НЕ РАВЕНСТВО лог.0
Duhas » 16 май 2010, 13:46
а так
- Код: Выделить всё • Развернуть
if (!(PINC & (1 << PC3)))
будет работать?
Lockdog » 16 май 2010, 14:11
Нет, так работать не будет, потому что проверяется на НЕ РАВЕНСТВО лог.1, т.е. твоя строка эквивалентна этому:
- Код: Выделить всё • Развернуть
if ((PINC & (1 << PC3)) != 1)
Duhas » 16 май 2010, 14:15
тогда просто убрать воскл знак.. иф(выражение) а выражение у тебя без сравнен7ий и так должно давать 0 или 1 ... ух ето си.. его пользовать нада еще научиться...
Lockdog » 16 май 2010, 14:50
Duhas писал(а):тогда просто убрать воскл знак.. иф(выражение) а выражение у тебя без сравнен7ий и так должно давать 0 или 1 ... ух ето си.. его пользовать нада еще научиться...
Ну можно и так =)
rig » 17 май 2010, 11:04
если так записать
- Код: Выделить всё • Развернуть
if ((PINC & (1 << PC3)) == (1 << PC3))
будет работать?
Добавлено спустя 1 минуту 9 секунд:подидее должно, тыж работаешь с байтом а сравниваешь
- Код: Выделить всё • Развернуть
if ((PINC & (1 << PC3)) != 0)
0b00000100 и !0b00000000
Добавлено спустя 1 минуту 59 секунд:и такая конструкция тож должна работать
- Код: Выделить всё • Развернуть
if (PINC.3 == 1)