Форум РадиоКот https://radiokot.ru/forum/ |
|
Вопрос к знатокам, почему не работают 2 прерывания совмесно https://radiokot.ru/forum/viewtopic.php?f=57&t=148501 |
Страница 1 из 3 |
Автор: | fulky [ Чт сен 21, 2017 14:16:10 ] |
Заголовок сообщения: | Вопрос к знатокам, почему не работают 2 прерывания совмесно |
Хочу запустить в работу одновременно таймер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){ } } |
Автор: | ARV [ Чт сен 21, 2017 14:19:14 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
Счетчики считают, пока включен таймер. В нормально написанных программах никакой блокировки нет и быть не может. как вы вычислили, что прерывания блокируются? у вас переменная i не объявлена volatile - не факт, что у вас вообще работоспособный код |
Автор: | fulky [ Чт сен 21, 2017 14:28:14 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
В протеусе добавьте аттини 85 и закоментите timer1_ini() в коде; выхода начнут зажигаться. по моей задумке таймером1 должны сброситься выходы |
Автор: | ARV [ Чт сен 21, 2017 14:41:40 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
fulky писал(а): В протеусе добавьте аттини 85 и закоментите timer1_ini() в коде; щаззз ![]() |
Автор: | fulky [ Чт сен 21, 2017 15:11:47 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
Увидеть своими глазами воочию |
Автор: | Z_h_e [ Чт сен 21, 2017 16:28:54 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
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 прерывания совмесно Пошаговая отладка решает много проблем, что же ей мало так кто пользуется. |
Автор: | Мурик [ Чт сен 21, 2017 16:38:37 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
Z_h_e писал(а): Пошаговая отладка решает много проблем, что же ей мало так кто пользуется. Наверное потому что ATtiny85 не поддерживает аппаратную отладку с пошаговым режимом. ![]() |
Автор: | Z_h_e [ Чт сен 21, 2017 16:42:10 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
Пошаговая не только в железе бывает. |
Автор: | fulky [ Чт сен 21, 2017 17:25:09 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
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 прерывания совмесно Пошаговая отладка решает много проблем, что же ей мало так кто пользуется. Код: 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???? |
Автор: | Z_h_e [ Чт сен 21, 2017 17:26:38 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
Нет. Подумайте сами. |
Автор: | fulky [ Чт сен 21, 2017 18:01:55 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
"|" |
Автор: | COKPOWEHEU [ Пт сен 22, 2017 10:19:00 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
я даже больше скажу: "|=" |
Автор: | ARV [ Пт сен 22, 2017 10:25:22 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
COKPOWEHEU писал(а): я даже больше скажу ух, рубанул!!! ![]() ![]() |
Автор: | Z_h_e [ Пт сен 22, 2017 16:25:32 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
"|" Самое главное чтобы это был не смайлик ![]() |
Автор: | fulky [ Сб сен 23, 2017 06:51:57 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
То чувство когда целый день делаешь и все получается, а потом под вечер из-за такого косяка часа 2 пялишься в монитор, пробуешь и ничего не выходит ![]() |
Автор: | Z_h_e [ Сб сен 23, 2017 07:03:00 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
Z_h_e писал(а): Пошаговая отладка решает много проблем,
|
Автор: | knyaz* [ Пн сен 25, 2017 22:42:24 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
А такое вообще возможно, что бы два прерывания работали одновременно? ![]() ![]() |
Автор: | Z_h_e [ Пн сен 25, 2017 22:51:18 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
При наличии нескольких необработанных событий МК уйдёт в прерывание с более высоким приоритетом. Обработав его прмется за другое, если конечно за это время опять не произойдёт событие с высоким приоритетом. Как правило обработчик прерывания делается с максимально быстрым кодом. |
Автор: | BOB51 [ Вт сен 26, 2017 06:43:13 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
А такое вообще возможно, что бы два прерывания работали одновременно? ![]() Возможно... При том, что одно из прерываний таки всегда начнет обрабатываться раньше (и завершит обработку позднее). Всего - то разрешить вложенные прерывания установкой флага I в SREG сразу за входом в первую из процедур обработки. ![]() Однако необходимо внимательно высчитывать интервалы выполнения самих обработчиков на вопрос "самоперекрытия" (приход нового запроса до завершения обработки предыдущего). ![]() |
Автор: | ozonn [ Вт сен 26, 2017 07:58:48 ] |
Заголовок сообщения: | Re: Вопрос к знатокам, почему не работают 2 прерывания совме |
Всего - то разрешить вложенные прерывания установкой флага I в SREG сразу за входом в первую из процедур обработки. ![]() флаг I разрешает все прерывания, а не вложенные. В атмеге одноуровневая система прерываний |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |