|
Не хочет работать прерывание компаратора в 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 я новичок...
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 26)
|
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:
|
|
|
|
|
Mar 14 2012, 10:46
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(_Pasha @ Mar 14 2012, 04:37)  Зогадко просто решается. В приведенном коде инициализации пинов напорото столько чуши, что. В чём чушь? Ноги в Z переводятся. Цитата(_Pasha @ Mar 14 2012, 04:37)  Вы определитесь хотя бы, на каких ногах этот компаратор висит. На PD6-PD7. Цитата(_Pasha @ Mar 14 2012, 04:37)  Зогадко просто решается. А какая разгадка? Цитата(AHTOXA @ Mar 13 2012, 20:11)  Как нам только что объяснил уважаемый ReAl, в avr-gcc, оказывается, не может. И что мешает в АРМ также сделать? Цитата(AHTOXA @ Mar 13 2012, 20:11)  А, например, в случае arm-gcc и cortex - запросто. (Например, вот, вот, вот и ещё кучу раз  ) Почитал - вспомнил: сом недавно по этим граблям походил.
|
|
|
|
|
Mar 14 2012, 11:04
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(_Артём_ @ Mar 14 2012, 13:46)  В чём чушь? Ноги в Z переводятся. На PD6-PD7. А какая разгадка? Вот она Код SFIOR |= (1<<ACME); ADMUX = 6; // настройка компаратора на 6 вход АЦП Уберите ACME, ибо у Вас компаратор чисто электрически не работает зы. Ой, не у Вас, а у ТС, конечно.
Сообщение отредактировал _Pasha - Mar 14 2012, 11:05
|
|
|
|
|
Mar 14 2012, 11:13
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(_Pasha @ Mar 14 2012, 13:04)  Вот она Код SFIOR |= (1<<ACME); ADMUX = 6; // настройка компаратора на 6 вход АЦП Уберите ACME, ибо у Вас компаратор чисто электрически не работает Как не работает? ACME=1 - It is possible to select any of the ADC7..0(1) pins to replace the negative input to the Analog Comparator. Работает, но сигнал берётся с ADC6. Или нет?
|
|
|
|
|
Mar 14 2012, 12:33
|

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

|
Паша, прежде чем ржать глянули бы в ДШ. Сигнал берётся с 6 канала АЦП, который не имеет функции пина, только АЦП, и инициализировать его как-то не нужно. Входы же компаратора переводятся в Z для пущей лучшести, т.к. имеют свойство гадить его работе в таком режиме. Т.к. они у меня пока не задействованы, перевёл в Z от греха. Ну и наконец, для бронебригад. Повторю в третий раз. Без прерывания компаратор РАБОТАЕТ. Биты и флаги встают как надо при изменении сигнала на входе. Этому посвящено 2/3 моего первого поста, с кусками кода и лирическими отступлениями. Не работает ТЕЛО ПРЕРЫВАНИЯ.
Всем. Проблему решил. Оказалось, тело прерывания таймера настолько перегружено, что не успевает выполнится до следующего переполнения. А когда выполняется, выбирает флаг с бОльшим приотритетом - то есть снова таймер. А компаратор лишь удивлённо смотрит в след... Первый раз такое вижу...
Сообщение отредактировал Dikoy - Mar 14 2012, 12:34
|
|
|
|
|
Mar 14 2012, 13:22
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Dikoy @ Mar 14 2012, 15:04)  Завязывать надо с С++ и писюковыми методами на МК... Назад к ассемблеру Си? Я думаю наоборот: С++ и PC-методам на МК всё большее применение находится. Хотя каждому своё.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|