0 / 0 / 0
Регистрация: 23.10.2014
Сообщений: 7
1

Не срабатывают внешние прерывания INT0/INT1 в Atmega8

23.10.2014, 13:41. Показов 4734. Ответов 3
Метки нет (Все метки)

Помогите разобраться новичку в МК, в чем может быть проблема.
Пытаюсь освоить самостоятельно создание частотника, застрял на процессе обработки внешнего прерывания INT0 и INT1, суть - при нажатии кнопки на PD2 частота уменьшается, а при нажатии кнопки на PD3 увеличивается синуса.
Программа написана в CodevisionAVR v2.05.0, дебагер AVRStudio 4.13, эмулятор схемный Proteus 7.7 SP2
Листинг программы -
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
volatile unsigned int freq_int = 1250;
#include <mega8.h>
 
int sin[128]={127,134,140,146,152,158,164,170,176,182,187,193,198,203,208,213,217,222,226,230,233,
236,240,242,245,247,249,251,252,253,254,254,254,254,254,253,252,251,249,247,245,242,
240,236,233,230,226,222,217,213,208,203,198,193,187,182,176,170,164,158,152,146,140,
134,127,121,115,109,103,97,91,85,79,73,68,62,57,52,47,42,38,33,29,25,22,19,15,13,10,
8,6,4,3,2,1,1,0,1,1,2,3,4,6,8,10,13,15,19,22,25,29,33,38,42,47,52,57,62,68,73,79,85,
91,97,103,109,115,121};
 
int i;
 
interrupt [TIM1_COMPA] void timer1_compa_isr(void) {
OCR2=sin[i];
i++;
if (i>127) i=0;
}
 
interrupt [EXT_INT0] void ext_int0_isr(void)
{
freq_int += 25; 
  }
  
interrupt [EXT_INT1] void ext_int1_isr(void)
{
freq_int -= 25; 
}   
     
void main(void) 
{
PORTB=0x00;
DDRB=0x08;
PORTD=0x0C;
DDRD=0x00;
TCCR1A=0x00;
TCCR1B=0x09;
TCNT1=0x00;
ICR1=0x00;
OCR1AH=(unsigned char)(freq_int >> 8);
OCR1AL=(unsigned char)freq_int;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x69;
TCNT2=0x00;
OCR2=0x00;
 
GICR|=0xC0;
MCUCR=0x00;
GIFR=0xC0;
 
TIMSK=0x10;
#asm("sei")
while (1)
      {
      
 
      };
}
Частота меняется вручную, заданием значения функции freq_int.
Пишу в CodevisionAVR (не предлагать WinAVR пожалуйста, сейчас речь идет не о религии, а о работоспособности в принципе), меняться по прерыванию не желает. (по протеусу)

Думал вначале функция не обрабатывается, запихнул код в дебагер AVRStudio, вручную поменял флаги INT0/INT1
Естественно при этом регистр OCR1A не меняется, значит проблема какая-то глобальная.

В чем может быть проблема?

Пожалуйста не надо писать бессмыслицы в стиле "все православную WinAVR юзают", пиши на асме. Так можно бесконечно метаться, нужна реальная помощь, в МК новичок.

Проблема я так понимаю в том, что прерывание не происходит.

заранее спасибо!

Читал хелп CodeVisionAVR на тему внешних прерываний, там достаточно сконфигурировать регистры
GICR|
MCUCR
GIFR
и указать векторы, что собственно сделал, в WinAVR надо еще подрубать библиотеку прерываний, судя по гуглу.

Добавлено через 26 минут
все, разобрался, нужно просто в бесконечный цикл запихнуть вычисление значения регистра OCR1A
C
1
2
OCR1AH=(unsigned char)(freq_int >> 8);
OCR1AL=(unsigned char)freq_int;
спасибо комраду с другого форума.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2014, 13:41
Ответы с готовыми решениями:

Проблема с прерываниями INT0 и INT1
Добрый вечер, форумчане. Возникла очередная проблема с ATmega64. Заключается в глючной работе...

Внешнее прерывание INT0. ATmega8
Я считаю что код правильный, но он не работает )))) Симуляция в Proteus показывает что прерывание...

ADXL345 сброс состояния ноги прерывания (INT1, INT2)
Доброго времени года! Пытаюсь работать с акселерометром ADXL345 и возникли проблемы с его...

При поступлении запроса прерывания на вход INT0, выдать в P1.4 с задержкой в мс
При поступлении запроса прерывания на вход INT0, выдать в P1.4 с задержкой в мс, заданный в ячейке...

3
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
23.10.2014, 13:43 2
Но лучше бы ты всёже в православной Atmel Studio 6 писал, удобнее. А теперь по делу -
- Нужно не только настроить INT0/1, нужно еще ножки настроить на реагирование на нажатие кнопки. Тебе повезло что ты до этого шага не дошел - потому что у тебя МК бы просто наглухо зависал и ты не знал почему, а я вот скажу тебе - при нажатии кнопки происходит дребезг и обработчики INT1/0 будут вызываться по 1000 раз.

Ты нам так и не дорассказал - ну засунул ты код в отладчик, поменял руками флаги..и? Что произошло то, прерывание вызывается? Если да - проверь правильная ли схема в протеусе, кнопку кста вторым концом к земле. Если нет - уточни как в коде указываются прерывания, я сам прост на AS6 пишу, там другой синтаксис - может крч среда не узнает обработчик.
Еще имей ввиду такой момент - AS дебагер криво работает с резисторами подтяжки, проследи всё ли там в порядке.
0
0 / 0 / 0
Регистрация: 23.10.2014
Сообщений: 7
23.10.2014, 14:52  [ТС] 3
Цитата Сообщение от NoobsEnslaver Посмотреть сообщение
а я вот скажу тебе - при нажатии кнопки происходит дребезг и обработчики INT1/0 будут вызываться по 1000 раз.
я в 1985 родился и знаю что это, решается очень просто и примитивно, как кувалдой по почкам, RC-цепочкой
И не надо никаких сложных кодов антидребезга писать.
Цитата Сообщение от NoobsEnslaver Посмотреть сообщение
нужно еще ножки настроить на реагирование на нажатие кнопки.
так они настроены, см. листинг, на ножках благодаря внутренней подтяжке уровень "1", прерывание настроено на уровень 0.
Цитата Сообщение от NoobsEnslaver Посмотреть сообщение
Ты нам так и не дорассказал - ну засунул ты код в отладчик, поменял руками флаги..и? Что произошло то, прерывание вызывается?
желаемый эффект достигнут, первичная частота указана в значении переменной вверху, при нажатии кнопок происходит увеличение/уменьшение на ~1 Гц частоты.
Цитата Сообщение от NoobsEnslaver Посмотреть сообщение
Если да - проверь правильная ли схема в протеусе, кнопку кста вторым концом к земле.
логично если нужен "0" на прерывание
Цитата Сообщение от NoobsEnslaver Посмотреть сообщение
Но лучше бы ты всёже в православной Atmel Studio 6 писал
Я это понимаю, сейчас просто нужно набить руку на чем-то попроще.
Спасибо за советы.
0
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
23.10.2014, 16:13 4
Ну МК на то и созданы, чтобы убрать из схемы всё что можно, в том числе и RC-цепочки. Это повышает отказоустойчивость и цену всей схемы.
А про "нужно настроить ножки" я и имел ввиду, донастроить т.е. антидребезг.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2014, 16:13

Не срабатывают прерывания
Привет. Написал программу для измерения длины импульса, прерывания должны срабатывать при приходе...

STM32F4 discovery не срабатывают прерывания по I2C
Работая по шине y2s в режиме ожидания флагов контроллер получает данные. Решил сделать работу на...

Прерывания по таймеру Т1 в Atmega8
Нужно на одном таймере Т1 (16 бит) в Atmega8 получить 2 разных вектора А и В прерывания. Даташит:...

Внешние прерывания
Кто-нить вкурсе есть ли у СТМов флаги внешних прерываний портов, а если есть то где их найти? А то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru