|
Не хочет работать прерывание компаратора в GCC+Eclipce. |
|
|
|
Mar 12 2012, 21:03
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676

|
Ну очень хочу зажечь светодиодик в прерывании. Не получается... Сразу скажу - код был отлажен в IAR, в том же железе, инициализация компаратора и т.д. корректные. В IAR всё работает как часы, в клипсе - затыкается. GCC+Eclipce. Инициализирую: Код PORTD &= ~((1<<6)|(1<<7)); // лапы компаратора на вход DDRD &= ~((1<<6)|(1<<7));
ADCSRA &= ~(1<<ADEN); // выключаю АЦП ACSR = (1<<ACBG)|(1<<ACIE)|(1<<ACIS1)|(1<<ACIS0); SFIOR |= (1<<ACME); ADMUX = 6; // настройка компаратора на 6 вход АЦП _delay_ms(1); ACSR |= (1 << ACI); // сброс флага прерывания, чтоб не возникло сразу после включения _delay_ms(1);
sei(); Собственно, кусок скопирован из IAR. Далее если делать так, то всё работает: Код if(ACSR & (1 << ACO) ) ON(LED); else OFF(LED); А вот если так, то фиг: Код ISR(ANA_COMP_vect) {
ON(LED);
} То есть софтовый опрос флага компаратора работает, значит железных проблем или проблем с инициализацией нет. Не работает именно прерывание. Куда порыть? В GCC я новичок...
|
|
|
|
|
Mar 13 2012, 12:41
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Возможно у вас не устанавливается флаг прерывания ACI. Поэтому прерывание не происходит. Цитата Далее если делать так, то всё работает: Код if(ACSR & (1 << ACO) ) ON(LED); else OFF(LED); Этот пример ничего не показывает, попробуйте так: Код if(ACSR & (1 << ACI) ) ON(LED); else OFF(LED); Если загорится, то и прерывание должно заработать, если нет - неправильно настроены условия возникновения прерываний компаратора.
|
|
|
|
|
Mar 13 2012, 13:58
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Dikoy @ Mar 13 2012, 15:27)  Как могут быть неправильно настроены условия возникновения прерываний компаратора Я только предположил.... Цитата(Dikoy @ Mar 13 2012, 15:27)  Возможно я вектор не так объявил? Возможно неправильно. Warning-ов не возникало? Попробуйте так: Код ISR(ANALOG_COMP_vect) Или в симуляторе установите флаг прерывания вручную и посмотрите в disassembler-е куда реально переходит программа.
|
|
|
|
|
Mar 13 2012, 14:28
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676

|
По F3 ANA_COMP_vect уводит в хидер: Код /* Analog Comparator */ #define ANA_COMP_vect _VECTOR(16) #define SIG_COMPARATOR _VECTOR(16) То есть тут тоже, вроде, всё ОК... Варнинг только один, но к компаратору даже близко не относящийся.
Сообщение отредактировал Dikoy - Mar 13 2012, 14:29
|
|
|
|
|
Mar 13 2012, 14:38
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Dikoy @ Mar 13 2012, 16:28)  По F3 ANA_COMP_vect уводит в хидер: Код /* Analog Comparator */ #define ANA_COMP_vect _VECTOR(16) #define SIG_COMPARATOR _VECTOR(16) То есть тут тоже, вроде, всё ОК... А какой процессор? Цитата(Dikoy @ Mar 13 2012, 16:28)  Варнинг только один, но к компаратору даже близко не относящийся. Уверенны?
|
|
|
|
|
Mar 13 2012, 16:56
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
А всё равно. Цитата(avr/interrupt.h) #ifdef __cplusplus # define ISR(vector, ...) \ extern "C" void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \ void vector (void) #else # define ISR(vector, ...) \ void vector (void) __attribute__ ((signal,__INTR_ATTRS)) __VA_ARGS__; \ void vector (void) #endif Но, поскольку в примерах scmRTOS есть и вариант переключения контекста в прерывании от компаратора, в avr-gcc можно получить обработку прерывания от оного. Причём для разных контроллеров с разными настройками (по одному или по обеим перепадам). Каких-то проблем в написании кода не помню. Пока я в первом сообщении темы в обработчике прерывания компаратора увидел только включение светодиода. Кода для выключения нет.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Mar 13 2012, 18:11
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(_Артём_ @ Mar 13 2012, 23:07)  А что это может быть источником проблем? Как нам только что объяснил уважаемый ReAl, в avr-gcc, оказывается, не может. А, например, в случае arm-gcc и cortex - запросто. (Например, вот, вот, вот и ещё кучу раз  )
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Mar 13 2012, 20:09
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676

|
Цитата(AHTOXA @ Mar 13 2012, 19:54)  А обработчик у вас не в cpp-файле? Там. Но там же и обработчик прерывания таймера, который, собака, работает. Цитата(ReAl @ Mar 13 2012, 20:56)  Пока я в первом сообщении темы в обработчике прерывания компаратора увидел только включение светодиода. Кода для выключения нет. Нету. Ибо мне бы хотя бы чтоб он загорелся  А там уж потушу как нибудь. Так он не загорается... Вообще... Весь контроллер уже проводком истыкал. Что-то не то с обработчиком. Компаратор работает 100%. Может он его оптимизирует... :spy:
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|