Страница 1 из 3
Вопрос к знатокам, почему не работают 2 прерывания совмесно
Добавлено: Чт сен 21, 2017 14:16:10
fulky
Хочу запустить в работу одновременно таймер0 и таймер1 на аттини85 и с них обрабатывать прерывания. Они настроены по разному с разными предделителями. Почему прерывания по вектору TIMER1_COMPA_vect полностью нейтрализует TIMER0_COMPA_vect?
и как сделать их одновременную работу.
Счетчики TCNT продолжают считать, пока выполняется любое из прерываний ?
Код: Выделить всё
#define F_CPU 1000000
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned char i=0;
//----------
void segchar (unsigned char seg)
{
switch (seg)
{
case 1: PORTB = 0b00000010; break;
case 2: PORTB = 0b00000110; break;
case 3: PORTB = 0b00001110; break;
case 4: PORTB = 0b00011110; break;
}
}
//----------
void timer_ini (void){
TCCR0A |= (1<<WGM01); //Устанавливаем режим СТС сброс по совпадению
TCCR0B |= (1<<CS02)|(0<<CS01)|(1<<CS00); //Делитель 1024
TIMSK |=(1<<OCIE0A); //бит разрешения прерываний
OCR0A = 0b11111111; //до чего считать
}
//----------
//обработка прерывания таймера0
ISR (TIMER0_COMPA_vect)
{
if (i>=5){i=1;}
segchar(i);
i++;
}
void timer1_ini (void){
TCCR1 |= (1 << CTC1) //режим CTC
|(0<<COM1A1)|(0<<COM1A0) //отключаем OC1A
|(1 << CS10)|(1 << CS11)|(1 << CS12)|(0 << CS13); //Делитель 8192
TCNT1 = 0x00; //сброс счетчика
OCR1A = 0xFA; //регистр сравнения
TIMSK =(1<<OCIE1A); //включаем прерывания по переполнению
}
//обработка прерывания таймера1
ISR(TIMER1_COMPA_vect){
PORTB = 0b00000000;
}
//----------
int main(void)
{
sei();
timer_ini();
timer1_ini();
DDRB = 0xfe;
PORTB = 0b00000000;
//----------
while(1){
}
}
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Чт сен 21, 2017 14:19:14
ARV
Счетчики считают, пока включен таймер. В нормально написанных программах никакой блокировки нет и быть не может.
как вы вычислили, что прерывания блокируются?
у вас переменная i не объявлена volatile - не факт, что у вас вообще работоспособный код
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Чт сен 21, 2017 14:28:14
fulky
В протеусе добавьте аттини 85 и закоментите timer1_ini() в коде;
выхода начнут зажигаться. по моей задумке таймером1 должны сброситься выходы
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Чт сен 21, 2017 14:41:40
ARV
fulky писал(а):В протеусе добавьте аттини 85 и закоментите timer1_ini() в коде;
щаззз

что еще сделать?
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Чт сен 21, 2017 15:11:47
fulky
Увидеть своими глазами воочию
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Чт сен 21, 2017 16:28:54
Z_h_e
fulky писал(а):|(1 << CS10)|(1 << CS11)|(1 << CS12)|(0 << CS13); //Делитель 8192
Это делитель на 64.
TIMSK =(1<<OCIE1A); //включаем прерывания по переполнению
и вЫключаем прерываний от таймера0.
--------
переменную i как volatile не стоит объявлять, но стоит ее объявить внутри обработчика прерывания как static.
Добавлено after 3 minutes 3 seconds:Re: Вопрос к знатокам, почему не работают 2 прерывания совмесноПошаговая отладка решает много проблем, что же ей мало так кто пользуется.
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Чт сен 21, 2017 16:38:37
Мурик
Z_h_e писал(а):Пошаговая отладка решает много проблем, что же ей мало так кто пользуется.
Наверное потому что ATtiny85 не поддерживает аппаратную отладку с пошаговым режимом.

Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Чт сен 21, 2017 16:42:10
Z_h_e
Пошаговая не только в железе бывает.
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Чт сен 21, 2017 17:25:09
fulky
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3188578#p3188578"]
fulky писал(а):|(1 << CS10)|(1 << CS11)|(1 << CS12)|(0 << CS13); //Делитель 8192
Это делитель на 64.
TIMSK =(1<<OCIE1A); //включаем прерывания по переполнению
и вЫключаем прерываний от таймера0.
--------
переменную i как volatile не стоит объявлять, но стоит ее объявить внутри обработчика прерывания как static.
Добавлено after 3 minutes 3 seconds:Re: Вопрос к знатокам, почему не работают 2 прерывания совмесноПошаговая отладка решает много проблем, что же ей мало так кто пользуется.[/uquote]
Код: Выделить всё
TCCR1 |= (1 << CTC1) //режим CTC
|(0<<COM1A1)|(0<<COM1A0) //отключаем OC1A
|(1 << CS13)|(0 << CS12)|(1 << CS11)|(0 << CS10); //Делитель 512
TCNT1 = 0x00; //сброс счетчика
OCR1A = 0xFF; //регистр сравнения
TIMSK =(1<<TOIE1); //включаем прерывания по переполнению
решил переделать на прерывание по переполнению, все тоже самое; получается все прерывания таймера1 отключают прерывания по таймеру0????
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Чт сен 21, 2017 17:26:38
Z_h_e
Нет. Подумайте сами.
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Чт сен 21, 2017 18:01:55
fulky
"|"
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Пт сен 22, 2017 10:19:00
COKPOWEHEU
я даже больше скажу: "|="
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Пт сен 22, 2017 10:25:22
ARV
COKPOWEHEU писал(а):я даже больше скажу
ух, рубанул!!!

Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Пт сен 22, 2017 16:25:32
Z_h_e
[uquote="fulky",url="/forum/viewtopic.php?p=3188642#p3188642"]"|"[/uquote] Самое главное чтобы это был не смайлик

.
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Сб сен 23, 2017 06:51:57
fulky
То чувство когда целый день делаешь и все получается, а потом под вечер из-за такого косяка часа 2 пялишься в монитор, пробуешь и ничего не выходит

Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Сб сен 23, 2017 07:03:00
Z_h_e
Z_h_e писал(а):Пошаговая отладка решает много проблем,
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Пн сен 25, 2017 22:42:24
knyaz*
А такое вообще возможно, что бы два прерывания работали одновременно?

Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Пн сен 25, 2017 22:51:18
Z_h_e
При наличии нескольких необработанных событий МК уйдёт в прерывание с более высоким приоритетом. Обработав его прмется за другое, если конечно за это время опять не произойдёт событие с высоким приоритетом. Как правило обработчик прерывания делается с максимально быстрым кодом.
Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Вт сен 26, 2017 06:43:13
BOB51
[uquote="knyaz*",url="/forum/viewtopic.php?p=3192142#p3192142"]А такое вообще возможно, что бы два прерывания работали одновременно?

...[/uquote]
Возможно...
При том, что одно из прерываний таки всегда начнет обрабатываться раньше (и завершит обработку позднее).
Всего - то разрешить вложенные прерывания установкой флага I в SREG сразу за входом в первую из процедур обработки.
Однако необходимо внимательно высчитывать интервалы выполнения самих обработчиков на вопрос "самоперекрытия" (приход нового запроса до завершения обработки предыдущего).

Re: Вопрос к знатокам, почему не работают 2 прерывания совме
Добавлено: Вт сен 26, 2017 07:58:48
ozonn
[uquote="BOB51",url="/forum/viewtopic.php?p=3192224#p3192224"]Всего - то разрешить вложенные прерывания установкой флага I в SREG сразу за входом в первую из процедур обработки.

[/uquote]
флаг I разрешает все прерывания, а не вложенные. В атмеге одноуровневая система прерываний