реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Не хочет работать прерывание компаратора в GCC+Eclipce.
Dikoy
сообщение Mar 12 2012, 21:03
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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 я новичок...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 13 2012, 12:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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);

Если загорится, то и прерывание должно заработать, если нет - неправильно настроены условия возникновения прерываний компаратора.
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Mar 13 2012, 13:27
Сообщение #3


Местный
***

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



Как могут быть неправильно настроены условия возникновения прерываний компаратора, если в IAR с тем же кодом всё работает как часы?
Мнемоники бит корректны, GCC их находит по F3.
Возможно я вектор не так объявил? GCC, он же самостийный, не такой как все...
Или ещё что-то надо включить где-то?
Прерывания таймера работают, что интересно...

Попробовал мониторить ACI в мейнлупе. Светодиод загорелся и горит, не тухнет (флаг то не сбрасывается) как и должен.
В обработчике светодиод по прежнему не загорается...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 13 2012, 13:58
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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-е куда реально переходит программа.
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Mar 13 2012, 14:28
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 13 2012, 14:38
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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) *
Варнинг только один, но к компаратору даже близко не относящийся.

Уверенны?


Go to the top of the page
 
+Quote Post
Dikoy
сообщение Mar 13 2012, 14:58
Сообщение #7


Местный
***

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



ATmega8.
Посмотрел в списке прерываний из ДШ, адрес 0x010 у компаратора. Как он получается в GCC так не понял, но хидер iom8.h из комплекта компилятора.

Про варнинг на 90% уверен:
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 13 2012, 15:26
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Dikoy @ Mar 13 2012, 16:58) *
ATmega8.
Посмотрел в списке прерываний из ДШ, адрес 0x010 у компаратора. Как он получается в GCC так не понял, но хидер iom8.h из комплекта компилятора.

С этим как раз понятно: 0x10=16.

Почему не работает не ясно - всё настроено вроде правильно и должно работать.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 13 2012, 15:54
Сообщение #9


фанат дивана
******

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



А обработчик у вас не в cpp-файле?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Mar 13 2012, 16:56
Сообщение #10


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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 можно получить обработку прерывания от оного. Причём для разных контроллеров с разными настройками (по одному или по обеим перепадам). Каких-то проблем в написании кода не помню.

Пока я в первом сообщении темы в обработчике прерывания компаратора увидел только включение светодиода. Кода для выключения нет.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 13 2012, 17:07
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(AHTOXA @ Mar 13 2012, 17:54) *
А обработчик у вас не в cpp-файле?

А что это может быть источником проблем?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 13 2012, 18:11
Сообщение #12


фанат дивана
******

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



Цитата(_Артём_ @ Mar 13 2012, 23:07) *
А что это может быть источником проблем?

Как нам только что объяснил уважаемый ReAl, в avr-gcc, оказывается, не может.
А, например, в случае arm-gcc и cortex - запросто. (Например, вот, вот, вот и ещё кучу разsm.gif )


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Mar 13 2012, 20:09
Сообщение #13


Местный
***

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



Цитата(AHTOXA @ Mar 13 2012, 19:54) *
А обработчик у вас не в cpp-файле?

Там. Но там же и обработчик прерывания таймера, который, собака, работает.



Цитата(ReAl @ Mar 13 2012, 20:56) *
Пока я в первом сообщении темы в обработчике прерывания компаратора увидел только включение светодиода. Кода для выключения нет.

Нету. Ибо мне бы хотя бы чтоб он загорелся sm.gif А там уж потушу как нибудь.
Так он не загорается... Вообще... Весь контроллер уже проводком истыкал.
Что-то не то с обработчиком. Компаратор работает 100%.
Может он его оптимизирует... :spy:
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Mar 13 2012, 21:19
Сообщение #14


Местный
***

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



Нее... Обработчик есть...

@0000027E: __vector_16
+0000027E: 921F PUSH R1 Push register on stack
+0000027F: 920F PUSH R0 Push register on stack
+00000280: B60F IN R0,0x3F In from I/O location
+00000281: 920F PUSH R0 Push register on stack
+00000282: 2411 CLR R1 Clear Register
+00000283: 9AA8 SBI 0x15,0 Set bit in I/O register
+00000284: 900F POP R0 Pop register from stack
+00000285: BE0F OUT 0x3F,R0 Out to I/O location
+00000286: 900F POP R0 Pop register from stack
+00000287: 901F POP R1 Pop register from stack
+00000288: 9518 RETI Interrupt return

Сообщение отредактировал Dikoy - Mar 13 2012, 21:19
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 14 2012, 02:37
Сообщение #15


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Ну Вы хе-хе-хе lol.gif
Зогадко просто решается. В приведенном коде инициализации пинов напорото столько чуши, что.
Вы определитесь хотя бы, на каких ногах этот компаратор висит. Из кода это неясно абсолютно.
А люди мозг ломают...

Сообщение отредактировал _Pasha - Mar 14 2012, 02:37
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 16:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01509 секунд с 7
ELECTRONIX ©2004-2016