Технический форум по робототехнике.
rig » 11 май 2010, 17:37
а где тогда текстовые комментарии, или думаешь, тут все вундеркинды и тунеядцы экстрасенсы?
Romikgy » 11 май 2010, 21:03
- Код: Выделить всё • Развернуть
if (PINC.0 == 0)
{
PORTD.0 = 1;
}
else
{
PORTD.0 = 0;
}
так не ?
Lockdog » 11 май 2010, 21:06
Romikgy » 11 май 2010, 21:30
если решил проблемку ок , нет выкладывай протеус проект посмотрим
rig » 12 май 2010, 07:22
варианты рабочие, можно сделать так:
PINC.0 = ~PINC.0;
или так
PINC.0 = !PINC.0;
таймер то работает?
Lockdog » 13 май 2010, 01:59
- Код: Выделить всё • Развернуть
#include <ioavr.h>
#include <intrinsics.h>
#include <iom8.h>
int main( void )
{
PORTC=(0<<PC0);
DDRD=255;
TCCR1B=(0<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(0<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);
TCNT1H=0xF0;
TCNT1L=0x6F; //значение 61551
//TIMSK=0x04;
TIMSK=(1<<TICIE1);
__enable_interrupt();
while(1)
{
PORTD = (1<<1);
}
}
#pragma vector = TIMER1_OVF_vect
__interrupt void flashing(void)
{
//if ((PINC & (1 << PC0)) == 1)
//{
PORTD = (1<<PD0);
//}
}
Таймер настроен на прерывание по переполнению, отсчёт начинается со значения (65535-3984)=61551
предделитель 1024, т.е. частота таймера 7813 Гц
время одного такта 0,000128 сек
Вот написал код в IAR, но не работают даже прерывания, моделил в протеусе. Помогите, плиз.
rig » 13 май 2010, 06:30
подобная команда у меня не работала
0<<CS11делал так:
~(1<<CS11) на выходе в разряде CS11 будет нолик а все остальные единички.
но нолик прилеплять надо через
& лог умножение
так что там получится после такой команды непонятно
- Код: Выделить всё • Развернуть
TCCR1B=(0<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(0<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);
Drunya » 13 май 2010, 09:40
rig писал(а):так что там получится после такой команды непонятно
- Код: Выделить всё • Развернуть
TCCR1B=(0<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(0<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);
Понятно. Лог. "или" нуля с любым числом оставит это же число. Другое дело, если после ресета эти биты не нули или раньше в них не писал что-нибудь.
Lockdog » 13 май 2010, 11:22
Строка:
- Код: Выделить всё • Развернуть
TCCR1B=(0<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(0<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);
Устанавливает режим таймер Normal, Top=0xFFFF
делал так:
~(1<<CS11)
на выходе в разряде CS11 будет нолик а все остальные единички.
но нолик прилеплять надо через & лог умножение
Не совсем понял.
У меня в TCCR1B только CS12 и CS10 должны быть единичками.
Добавлено спустя 1 час 40 минут 6 секунд:Исправил TIMSK=(1<<TICIE1); на TIMSK=(1<<TOIE1); (не то прерывание обрабатывалось), но всё равно не работает
rig » 13 май 2010, 12:22
честно говоря я еще ни разу таймер по даташиту не настраивал, обычно беру мастер, выставляю что хочу. Расчитываю задержки, ставлю константы и пользуюсь готовым кодом.
Мне непонятна эта проблема не решающаяся с 18 мар 2010 18:32.
Добавлено спустя 12 минут 34 секунды:Lockdog писал(а):Я хочу чтобы таймер через каждые 0,5 сек вызывал прерывание и в нём проверял состояние ножки и если оно = 1, то выполнять какю-либо команду
Мега 8я?
таймер какой задействовать??
послезавтра могу код таймера дать

Lockdog » 13 май 2010, 12:34
Ну это тема с 18-го марта=) была большая пауза и недавно я опять взялся за проблему. Да - мега8, таймер любой можно.
Просто сейчас пишщу на IAR.
Мне непонятно, почему прерывание не срабатывает.
rig » 14 май 2010, 07:47
подумалось тут, МК ваабще признаки жизни подает? светодиодиком помигать можно?
Lockdog » 14 май 2010, 09:56

Конечно, всё работает, сигналы переключает, без глюков. Я говорю о том, что у меня в протеусе прерывания не работают.
rig » 14 май 2010, 10:53
то есть все работает и помощь уже не нужна?
Накойтогда протеус если все работает?
Lockdog » 14 май 2010, 11:39
Я имею ввиду, что контроллер жив, но вот с прерываниями я где-то напортачил.