roboforum.ru

Технический форум по робототехнике.

Any logical change on INT0/INT1 - Неработает обработчик прер

Any logical change on INT0/INT1 - Неработает обработчик прер

AGman » 09 авг 2009, 11:15

Добрый день/ночь/утро Формучане!
Пишу простенькую прогу для простенького регулятора скорости для PPM RC радиаппаратуры..
Для обработки длительности управляющего импульса решил использовать линию прервыания INT1 настроенную на формирования прерывания по смене логического сотояния на входе INT1.

Решив проверить жив ли пациент или мертв (я про ПРОЕКТ) в PROTEUS (пробовал даже в симуляторе AVR Studio), был приятно удивлен тем, что при смене уровня вхождения в обработчик не происходит. При настройке на falling edge или rising edge обработчик выполняется. Пробовал по линиям INT1 и INT0 - ничего не происходит... Пробовал компилировать в AVR Studio и CodeVision - борода... Пробовал компилировать под Mega8 и Mega16 - нет слов... В общем виню архитектуру AVR. Специально прошуршил даташит и убедился в том, что вектор прерывания falling edge/Any logical change/The low level/The rising edge (для INT1) один и тот же (для ряда кристалов используются ветор Pin Change Interrupt Request X для обработки смены уровня).
Помогите товарищи!!!! Поясните почему в режиме Any logical change не выполняется обработчик прерывания?


Листинг в AVR STUDIO:
Код: Выделить всёРазвернуть
 #include <avr/io.h>
#include <avr/interrupt.h>
#define FTACT 1000000 //тактовая частота процессора Гц
#define F_TIMER1_TACT 0.001 //(мс) периодичность счета таймера1 Гц
#define PPM_PER 20 //(мс) период упр имп
#define PPM_MIN 0.8 //(мс) минимальная длительнось упр имп (крайнее левое полож)
#define PPM_MID 1.5 //(мс) средняя длительнось упр имп центральное полож)
#define PPM_MAX 2.2 //(мс) максимальная длительнось упр имп (крайнее правое полож)
#define PPM_NORM_CONST (F_TIMER1_TACT*65536)/((PPM_MAX -PPM_MIN)/F_TIMER1_TACT) //константа для приведения получ длит имп-а к нормальному виду
#define c_FORV_motion 1  // прямое движение
#define c_BACKW_motion 0 // обратное движение



typedef struct         // тип - структура описывающая входной канал
    {
   unsigned int v_mot_speed_LEV;  // скорость вращения
   unsigned char v_mot_speed_DIR; // направление движения мотора
   unsigned char v_PPM_prev_LEV;  // предыдущее значеие уровня упр сигнала
    } T_PPM_INPUT;

T_PPM_INPUT CH1; // создаем 1- й входной канал

// External Interrupt 0 service routine
//interrupt [EXT_INT1] void ext_int1_isr(void)
ISR(INT1_vect)
{
  PORTB=(PORTB^1);// так для проверки вхождения в перывание!
if (CH1.v_PPM_prev_LEV==0) //передний фронт
    {
    // начать счёт
    TCNT1H=0x00;
    TCNT1L=0x00;
    CH1.v_PPM_prev_LEV=1;
    TCCR1B=0x01;// запуск таймера 1
    }
else             //задний фронт
    {
    TCCR1B=0x00; //остановка таймера 1
    CH1.v_mot_speed_LEV =TCNT1L;  // cначала читаем младшие разряды / старшие пишутся в ТЕМП
    CH1.v_mot_speed_LEV |=TCNT1H<<8;// Считать старшие из ТЕМП
    CH1.v_mot_speed_LEV*= PPM_NORM_CONST;
    if  (CH1.v_mot_speed_LEV>0x7FFF)   //больше половины
    CH1.v_mot_speed_DIR=c_FORV_motion;
    else
    CH1.v_mot_speed_DIR=c_BACKW_motion;

    CH1.v_PPM_prev_LEV=0;
    }
}

// Timer 2 overflow interrupt service routine
//interrupt [TIM2_OVF] void timer2_ovf_isr(void)
ISR(TIMER2_OVF_vect)
{

if (CH1.v_mot_speed_DIR)
{PORTB|=1<<2;
PORTB&=~(1<<1);}
else
{PORTB|=1<<1;
PORTB&=~(1<<2);}
OCR2 = (CH1.v_mot_speed_LEV>>8);
}

// Timer 2 output compare interrupt service routine
//interrupt [TIM2_COMP] void timer2_comp_isr(void)
ISR(TIMER2_COMP_vect)
{
if (CH1.v_mot_speed_DIR)
    PORTB&=~(1<<2);
else
    PORTB&=~(1<<1);
}

// Declare your global variables here

int main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=out
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x07;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: Fast PWM top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x4B;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Any change
// INT2: Off
GICR|=0x80;
MCUCR=0x04;
MCUCSR=0x00;
GIFR=0x80;



// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0xC0;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
sei();
CH1.v_PPM_prev_LEV=0;
while (1)
      {
      // Place your code here

      };
}

Последний раз редактировалось AGman 10 авг 2009, 20:51, всего редактировалось 3 раз(а).

Re: Any logical change on INT0/INT1 - Неработает обработчик прер

nest » 09 авг 2009, 12:56

почему в режиме Any logical change не выполняется обработчик прерывания?

у всех выполняется. проините его правильно.

Re: Any logical change on INT0/INT1 - Неработает обработчик прер

avr123.nm.ru » 09 авг 2009, 14:11

AGman писал(а):Помогите товарищи !!!! Поясните почему в режиме Any logical change не выполняется обработчик прерывания ?


Вот видео вам сделал по настройке INT0 в AVR :D
Модератор Setar:http://www.youtube.com/watch?v=KjQ4Xhl7ns8
Ролики Youtube вставляются так: [yоutube]KjQ4Xhl7ns8[/yоutube]
пример:



Попробовал прогу Camtasia Studio для записи и редактирования видео поисходящего на ПК
viewtopic.php?f=11&t=6352&p=112159#p112159

Re: Any logical change on INT0/INT1 - Неработает обработчик прер

Angel71 » 09 авг 2009, 20:11

:ROFL: "шо он сказаааал"

Re: Any logical change on INT0/INT1 - Неработает обработчик прер

AGman » 10 авг 2009, 16:28

avr123.nm.ru писал(а):
AGman писал(а):Вот видео вам сделал по настройке INT0 в AVR :D
http://www.youtube.com/watch?v=KjQ4Xhl7ns8

Уважаемый avr123.nm.ru, меня порадовало ваше творение... :good: Однако, я уж не такой БУРУНДУК как вам показалось. Листинг, прикрепленный в начале ветки (уже портированный в AVR Studio...), изначально был сгенерирован именно визардом Codevisiion`А.

nest писал(а):
почему в режиме Any logical change не выполняется обработчик прерывания?

у всех выполняется. проините его правильно.
[/quote]
Уважаемый Nest, Инициализация управляющих регистров как раз правильная (Codevision wizard постарался).

Если кто-нибудь работал именно с этим режимом внешнего прерывания , пжалСТА поделитесь опытом и куском кода с ближним (если в нем есть фундаментальные отличия от моего в местах настройки и обработчика прерывания). Я в тупике! Никакие заGOOGLи не помогли.!

Re: Any logical change on INT0/INT1 - Неработает обработчик прер

avr123.nm.ru » 10 авг 2009, 16:32

Я вас бурундуком не считал :) я ж написал - хотелость прогу опробовать :D да и кино понравилось - вот музычку воткнул.

Вы из проги удалите все что не относится к прерванию и посто сделайте переключение ножки в прерывании. Должно работать.

Вы в железе смотрите ? Тогда убедитесь что МК вообще шагает по проге.

Про 1 вектор. Он один, но условия перехода на него разные и пограмно управляются.

Re: Any logical change on INT0/INT1 - Неработает обработчик прер

Digit » 10 авг 2009, 16:38

AGman писал(а):...Решив проверить жив ли пациент или мертв (я про ПРОЕКТ) в PROTEUS...

Протеус очень часто косячит в неожиданных местах. О симуляции AVRStudio такого я не слышал, но фик его знает.
А в железе собиралось и не работает? Или все эксперименты модельные?

Re: Any logical change on INT0/INT1 - Неработает обработчик прер

AGman » 10 авг 2009, 16:50

Только в симуляторах, до железа пока не дошел. Щас в голову пришла мысля, проверить работу прерывания отключив все таймеры (щас пользую: TIMER1 - просто как счетчик, без генерации прерывания; TIMER2 - для быстрого ШИМ, с генерацией 2х видов прерываний, без вывода сигнала на выделенные лапы чипа) (может конфликт переферии какой?... :?: )

Таймер1 и таймер2 со своими прерываниями работают на ура (на 100%). Внешнее прерывание - ... - чепуха какая-то (тоже 100%ная). :%)

Re: Any logical change on INT0/INT1 - Неработает обработчик прер

avr123.nm.ru » 10 авг 2009, 17:01

У меня в PROTEUS нормально работает. Проекты в прицепе.
Вложения
int1.rar
(8.84 КиБ) Скачиваний: 10

Re: Any logical change on INT0/INT1 - Неработает обработчик прер

blindman » 10 авг 2009, 17:23

Тот код что автор привёл работает конечно. Но не так как автор описывает. Прерывание настроено на спад, а не на изменение. И код сгенерированный мастером который закомментирован - верный (MCUCR=0x04;). Зачем его понадобилось менять?

AGman, совет: если выкладываешь код, приводи его к виду, который читать можно. Символьные имена битов для того и придуманы. Согласись, что конструкцию
Код: Выделить всёРазвернуть
MCUCR = (1 << ISC10);

проще понять и порверить по даташиту, чем
Код: Выделить всёРазвернуть
MCUCR=0x04;

Я например глядя в даташит не сразу перевел 0x0C в номера битов.

Re: Any logical change on INT0/INT1 - Неработает обработчик прер

AGman » 10 авг 2009, 18:30

Елки!!!! Благодарю за внимательность! Все порпавил. В пост вставил тот код на котором проверял срабатывание по срезу, а нужный (по смене уровня) закоментировал и впоследствие забыл вернуть.

Насчет использования символьного представления разряда бита регистра - оно-то конечно удобнее, тут спору нет.

Ну да ладно... не в этом дело...

Проводя запланированный чуть выше эксперимент, выяснил, что ни таймеры ни их прерывания непричем...
Посмотрел код присланый AVRом - почти чистый визард, НО, так как его ISIS проект у меня не открылся в силу дремучести весии моего PROTEUSA (7,2 СП2), я решил подключить его hex к своему проекту... результат -НИФИГА. Што-то, где-то, как-то ....
Щас сижу отлаживаю по шагам в AVR Studio debuggere. При ручной установке флага INTF1 регистра GIFR успешно летим по нужному вектору прерывания, до следующей манипуляии руками. А автоматом гад не хочет.... Ищу ошибку...

Добавлено спустя 12 минут 56 секунд:
Все разобрался - мой косяк... Протеус действительно (по крайней мере у меня, по крайней мере эта версия, и еще чего0нибудь по крайней мере... ) не корректно обрабатывает этот режим внешнего прерывания.
А в AVR studio оказывается работает на ура, просто я условия для его формировал неправильно создавал :oops: ...
Тему закрываю :on_off: , хотя было бы интересно, если кто-нибудь проверил бы у себя на этой же версии протеуса СЕЮ теорию.

Всем спасибо за внимание и отзывы... :beer:
Вложения
rcreg.rar
Вот все мое барахло Проекты: ISIS и AVR STUD
(24.79 КиБ) Скачиваний: 4
Последний раз редактировалось AGman 10 авг 2009, 20:54, всего редактировалось 1 раз.

Re: Any logical change on INT0/INT1 - Неработает обработчик прер

avr123.nm.ru » 10 авг 2009, 18:39

Попробуйте симулятор AVR хорошо работающий VMLAB и небольшой 4,5 Мб всего
или PROTEUS свежий скачайте - http://proteus123.narod.ru
Последний раз редактировалось blindman 10 авг 2009, 18:46, всего редактировалось 1 раз.
Причина: Нету там VMLAB

Re: Any logical change on INT0/INT1 - Неработает обработчик прер

AGman » 10 авг 2009, 18:55

Протеуса 7.5 прям сейчас качаю, надеюсь там все исправлено. Очень уж нужно легко и непринужденно подать на AVRку тестовый PPM сигнал, а протус для этого как нельзя лучше подходит... Давным-давно на VMLAB моего терпения хватило ровно на 7 мин 15 сек.

Re: Any logical change on INT0/INT1 - Неработает обработчик прер

avr123.nm.ru » 10 авг 2009, 19:07

>> Нету там VMLAB

Я ведь и не писал что там VMLAB ! там просто информация о программе которую я рекомендовал человеку "попробуйте ..." - рассказано что это за программа и показаны некоторые примеры работы с ней.


Rambler\'s Top100 Mail.ru counter