T/C2

Здесь все вопросы по языку программирования С
Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: T/C2

Сообщение gurvinok » 29 сен 2016, 09:09

Ну ёлы палы, а кино я для кого записывал. Все в пустую. Ну что ж, повторение мать-учение.

Код: Выделить всё


1   volatile unsigned char flag = 0;
2 
3   ISR(INT0_vect)
4   {
5      PORTC &= ~(1 << PORTC0);
6      TCNT2 = 0x00;
7      flag = 1;
8      TIMSK |= (1 << OCIE2);
9      GICR &= ~(1<<INT0);
10  }
11 
12   ISR(INT0_vect)
13   {
14      if(flag == 1)
15      {
16           PORTC |= (1 << PORTC0);
17           flag = 0;
18           TCNT2 = 0x00;
19      }
20      else
21      {
22           PORTC &= ~(1 << PORTC0);
23           TIMSK &= ~(1 << OCIE2);
24           GICR |= (1<<INT0);
25       }
26   }  
Специально расписал по строкам.
Строка 1 - Глобальная переменная флаг, инициализируется исключительно перед всеми функциями и видна во всей программе.
Строка 3 - Обработчик прерывания по входу от INT0
Строка 5 - Обнуляем PORTC0
Строка 6 - Обнуляем регистр счета у второго счетчика
Строка 7 - Взводим флаг, говоря тем самым что была нажата кнопка.
Строка 8 - Разрешаем прерывание по совпадению второго таймера.
Строка 9 - Запрещаем прерывание от входа INT0 дабы пока работаем с таймером, нажатие на кнопку не вызывало ложные прерывание. (Для особо нервных которые любят давить на кнопку морзянкой)
Строка 12 - Тело обработчика прерывания по совпадению второго таймера
Строка 14 - Проверяем флаг, если единица значит кнопку только что нажали, иначе идет процедура работы после нажатия на кнопку.
Строка 16 - Выставляем бит PORTC0
Строка 17 - Сбрасываем флаг
Строка 18 - Обнуляем регистр счета у второго счетчика
Строка 22 - Сюда приходим если нулевой пин порта С выставлен и прошло еще заданное время. Сбрасываем пин PORTC0
Строка 23 - Запрещаем прерывание по совпадению второго таймера. Это нужно чтобы МК не бегал в обработчик пока не нажали кнопку.
Строка 24 - Разрешаем прерывания от события INT0, то бишь ждем очередного нажатия на кнопку.

Короче ща закончу со своими делами и начну записывать курс по азам СИ и МК AVR.
Если долго мучиться, может быть получится.

AVRIK
Сообщения: 119
Зарегистрирован: 24 сен 2016, 11:25

Re: T/C2

Сообщение AVRIK » 29 сен 2016, 10:41

Здравствуйте!
Спасибо что уделили внимание! Тут я один нюанс не понимаю. Пояснение по строке 12-Тело обработчика прерывания по совпадению второго таймера. А в коде прописано ISR(INT0_vect); Вопрос такой: можно ли по одному событию дважды активировать "тело" вектора прерывания INT0. Срабатывание прерывания у вас прописано так: Строка 3 - Обработчик прерывания по входу от INT0, т.е. одно условие прерывания, а "тел" векторов прерывания 2.
Видимо я что-то не знаю! Слушаю вас!

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: T/C2

Сообщение gurvinok » 29 сен 2016, 10:55

Опечатка, конечно же TIMER2_COMP_vect
Обработчик должен дать только один.
Если долго мучиться, может быть получится.

AVRIK
Сообщения: 119
Зарегистрирован: 24 сен 2016, 11:25

Re: T/C2

Сообщение AVRIK » 29 сен 2016, 15:39

Давайте я со своей колокольни прочту ваш код.
Сначала то что вы предпологаете "за кулисами"

void int0_set(void); // установки для инициализации int0;
{
MCUCR=0X00;
MCUCR|=(1<<ISC0) //спадающий вронт
GICR|=(1<<INT0) //режим int0
)
void timer2_set(void)
{
TCNT2=0; // стартовое число счетчика
OCR=100; //число для совпадения с tcnt
// TIMSK|=(1<<OCIE2); //прерывание по совпадению
TCCR2|=((1<<WGM21)|(1<<CS21)|(1<<CS20)); //активируем СТС|прескалер
}
1 volatile unsinged char flag=0;
2
3 ISR(INT0_vect)
4 {
5 PORTC &= ~(1 << PORTC0); //обнулили ПИНС0
6 TCNT2 = 0x00; // обнулили TCNT2
7 flag = 1; //выставили флаг в "1".
8 TIMSK |= (1 << OCIE2); //активировали TIMSК (по этому в настройках TIMSK погашен-правильно?
9 GICR &= ~(1<<INT0); //гасим прерывание int0;
10 }
11
12 ISR(INT0_vect) ISR(TIMER2_vect)
13 {
14 if(flag == 1) //если флаг=1(так и есть по установке isr_int0
15 {
16 PORTC |= (1 << PORTC0); //выставляем в "1" портС0
17 flag = 0; //обнуляем флаг
18 TCNT2 = 0x00; //обнуляем tcnt2 -(а что, он не ноль? думаете таймер запустился по актива
19 } //ции timsk в isr_int0-? и тикает до OCR2?!
20 else //если флаг=1,ложь, и так и есть (следующим прозвоном "if")
21 {
22 PORTC &= ~(1 << PORTC0); //обнуляем портС0
23 TIMSK &= ~(1 << OCIE2); //гасим прерывание по совпадению
24 GICR |= (1<<INT0); //активируем int0
25 }
26 }
Я что-то не так понимаю?

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: T/C2

Сообщение gurvinok » 29 сен 2016, 16:33

Все верно, только volatile unsinged char flag=0; должно идти выше всех. Самая первая строка.
Если долго мучиться, может быть получится.

AVRIK
Сообщения: 119
Зарегистрирован: 24 сен 2016, 11:25

Re: T/C2

Сообщение AVRIK » 29 сен 2016, 16:39

Хорошо! Сейчас загружу в протеус, посмотрю что скажет! А может быть что протеус врет и камень заработает? Вроде код не сложный, протеус осилит!

AVRIK
Сообщения: 119
Зарегистрирован: 24 сен 2016, 11:25

Re: T/C2

Сообщение AVRIK » 29 сен 2016, 17:15

Все ок. Спасибо большое!

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: T/C2

Сообщение gurvinok » 29 сен 2016, 18:33

А жвачку Дональд со фкладышем? :cry:
Если долго мучиться, может быть получится.

AVRIK
Сообщения: 119
Зарегистрирован: 24 сен 2016, 11:25

Re: T/C2

Сообщение AVRIK » 29 сен 2016, 19:21

Знал бы куда, без проблем!

Аватара пользователя
gurvinok
Сообщения: 1473
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: T/C2

Сообщение gurvinok » 29 сен 2016, 19:28

В мое детство за такую родину бы продали.
1231.jpg
Если долго мучиться, может быть получится.

Ответить