roboforum.ru

Технический форум по робототехнике.
Текущее время: 28 фев 2025, 12:24

Часовой пояс: UTC + 4 часа




Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Any logical change on INT0/INT1 - Неработает обработчик прер
СообщениеДобавлено: 09 авг 2009, 11:15 
Не в сети

Зарегистрирован: 28 дек 2007, 21:05
Сообщения: 8
Добрый день/ночь/утро Формучане!
Пишу простенькую прогу для простенького регулятора скорости для 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 - Неработает обработчик прер
СообщениеДобавлено: 09 авг 2009, 12:56 
Не в сети
Аватара пользователя

Зарегистрирован: 21 янв 2005, 12:16
Сообщения: 977
Откуда: Germany
прог. языки: asm
Цитата:
почему в режиме Any logical change не выполняется обработчик прерывания?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Any logical change on INT0/INT1 - Неработает обработчик прер
СообщениеДобавлено: 09 авг 2009, 14:11 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
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 - Неработает обработчик прер
СообщениеДобавлено: 09 авг 2009, 20:11 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
:ROFL: "шо он сказаааал"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Any logical change on INT0/INT1 - Неработает обработчик прер
СообщениеДобавлено: 10 авг 2009, 16:28 
Не в сети

Зарегистрирован: 28 дек 2007, 21:05
Сообщения: 8
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 - Неработает обработчик прер
СообщениеДобавлено: 10 авг 2009, 16:32 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Я вас бурундуком не считал :) я ж написал - хотелость прогу опробовать :D да и кино понравилось - вот музычку воткнул.

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Any logical change on INT0/INT1 - Неработает обработчик прер
СообщениеДобавлено: 10 авг 2009, 16:38 
Не в сети
Аватара пользователя

Зарегистрирован: 27 ноя 2004, 00:42
Сообщения: 3339
Откуда: совсем Москва
ФИО: Григорий
AGman писал(а):
...Решив проверить жив ли пациент или мертв (я про ПРОЕКТ) в PROTEUS...

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

_________________
злой полицейский


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Any logical change on INT0/INT1 - Неработает обработчик прер
СообщениеДобавлено: 10 авг 2009, 16:50 
Не в сети

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Any logical change on INT0/INT1 - Неработает обработчик прер
СообщениеДобавлено: 10 авг 2009, 17:01 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
У меня в PROTEUS нормально работает. Проекты в прицепе.


Вложения:
int1.rar [8.84 КиБ]
Скачиваний: 10
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Any logical change on INT0/INT1 - Неработает обработчик прер
СообщениеДобавлено: 10 авг 2009, 17:23 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2008, 21:15
Сообщения: 4130
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич
Тот код что автор привёл работает конечно. Но не так как автор описывает. Прерывание настроено на спад, а не на изменение. И код сгенерированный мастером который закомментирован - верный (MCUCR=0x04;). Зачем его понадобилось менять?

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

проще понять и порверить по даташиту, чем
Код:
MCUCR=0x04;

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

_________________
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Any logical change on INT0/INT1 - Неработает обработчик прер
СообщениеДобавлено: 10 авг 2009, 18:30 
Не в сети

Зарегистрирован: 28 дек 2007, 21:05
Сообщения: 8
Елки!!!! Благодарю за внимательность! Все порпавил. В пост вставил тот код на котором проверял срабатывание по срезу, а нужный (по смене уровня) закоментировал и впоследствие забыл вернуть.

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

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

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

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

Всем спасибо за внимание и отзывы... :beer:


Вложения:
Комментарий к файлу: Вот все мое барахло Проекты: ISIS и AVR STUD
rcreg.rar [24.79 КиБ]
Скачиваний: 4


Последний раз редактировалось AGman 10 авг 2009, 20:54, всего редактировалось 1 раз.
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Any logical change on INT0/INT1 - Неработает обработчик прер
СообщениеДобавлено: 10 авг 2009, 18:39 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Попробуйте симулятор AVR хорошо работающий VMLAB и небольшой 4,5 Мб всего
или PROTEUS свежий скачайте - http://proteus123.narod.ru


Последний раз редактировалось blindman 10 авг 2009, 18:46, всего редактировалось 1 раз.
Нету там VMLAB


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Any logical change on INT0/INT1 - Неработает обработчик прер
СообщениеДобавлено: 10 авг 2009, 18:55 
Не в сети

Зарегистрирован: 28 дек 2007, 21:05
Сообщения: 8
Протеуса 7.5 прям сейчас качаю, надеюсь там все исправлено. Очень уж нужно легко и непринужденно подать на AVRку тестовый PPM сигнал, а протус для этого как нельзя лучше подходит... Давным-давно на VMLAB моего терпения хватило ровно на 7 мин 15 сек.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Any logical change on INT0/INT1 - Неработает обработчик прер
СообщениеДобавлено: 10 авг 2009, 19:07 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
>> Нету там VMLAB

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 14 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO