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

 
 
21 страниц V  « < 18 19 20 21 >  
Reply to this topicStart new topic
> Изменение текста программы при смене компилятора и чипа
RW6MKA
сообщение Dec 5 2011, 13:15
Сообщение #286


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Цитата(Палыч @ Dec 5 2011, 16:29) *
Не-а... Одно, всё-таки проскочит...
По условию прерывания будет взведён флаг прерывания, и, после выхода из процедуры обработки этого прерывания, будет сгенерировано ещё одно... Поэтому, перед выходом из процедуры обработки прерывания, наверное, нужно сбросить флаг прерывания (сбрасывается записью во флаг единицы ! ).

• Bit 5 – PCIF: Pin Change Interrupt Flag
When a logic change on any PCINT7..0 pin triggers an interrupt request, PCIF becomes
set (one). If the I-bit in SREG and the PCIE bit in GIMSK are set (one), the MCU will
jump to the corresponding Interrupt Vector. The flag is cleared when the interrupt routine
is executed.
Alternatively, the flag can be cleared by writing a logical one to it.
Насколько я понял флаг будет сброшен после выполнения обработчика прерывания, а в обработчике стоит задержка которой достаточно чтобы избежать любого дребезга.Откуда же второе подряд прерывание ведь если всё это время флаг установлен то инициализация другого прервания запрещена?Или я что то не так понял?

Сообщение отредактировал RW6MKA - Dec 5 2011, 13:25
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 5 2011, 15:01
Сообщение #287


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(RW6MKA @ Dec 5 2011, 17:15) *
Или я что то не так понял?

Как только программа попала на JMP в таблице векторов - так сразу и "interrupt routine is executed".
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Dec 5 2011, 15:11
Сообщение #288


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Цитата(Палыч @ Dec 5 2011, 19:01) *
Как только программа попала на JMP в таблице векторов - так сразу и "interrupt routine is executed".

Ага, значит если импульс был не один то пока идёт обработка первого прерывания уже установлен флаг второго?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 5 2011, 15:22
Сообщение #289


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(RW6MKA @ Dec 5 2011, 19:11) *
пока идёт обработка первого прерывания уже установлен флаг второго?

Да. Об этом выше я и говорил.
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Dec 5 2011, 16:27
Сообщение #290


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Цитата(Палыч @ Dec 5 2011, 19:22) *
Да. Об этом выше я и говорил.

Да, это именно то, что портило мне спокойный сон))) После принудительной очистки флага перед выходом из обработчика всё стало почти отлично, а когда флаг стал очищать и перед циклом поворота(видимо в момент включения реле и соответственно подачи питания на валкодер проходил какойто импульс который "взводил" флаг) жизнь вошла в своё русло)))
Go to the top of the page
 
+Quote Post
MaslovVG
сообщение Dec 5 2011, 17:25
Сообщение #291


Профессионал
*****

Группа: Свой
Сообщений: 1 210
Регистрация: 24-01-05
Из: Россия Волгодонск
Пользователь №: 2 134



Всетаки обратите внимание на мой пост 283.
Земляной провод сигнала DATA в зависимости от напрвления вращения двигателя проходит через разные диоды моста BR2 разные контакты реле К2, а в состоянии стоп двигателя, вообще висит в воздухе. Причем по этой же цепи течет ток двигателя. Наличие ложных сигналов на DATA просто неизбежно.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 5 2011, 22:53
Сообщение #292


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата(Палыч @ Dec 5 2011, 16:29) *
Не-а... Одно, всё-таки проскочит...
По условию прерывания будет взведён флаг прерывания, и, после выхода из процедуры обработки этого прерывания, будет сгенерировано ещё одно... Поэтому, перед выходом из процедуры обработки прерывания, наверное, нужно сбросить флаг прерывания (сбрасывается записью во флаг единицы ! ).
Да. Вы правы. Недодумал немного насчёт флага.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Dec 7 2011, 06:45
Сообщение #293


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Цитата(MaslovVG @ Dec 5 2011, 21:25) *
Всетаки обратите внимание на мой пост 283.
Земляной провод сигнала DATA в зависимости от напрвления вращения двигателя проходит через разные диоды моста BR2 разные контакты реле К2, а в состоянии стоп двигателя, вообще висит в воздухе. Причем по этой же цепи течет ток двигателя. Наличие ложных сигналов на DATA просто неизбежно.

Но не добавлять же ещё один провод. Тогда проще валкодер вообще подключить отдельными проводами. Вопрос и стоял в том, что бы программно избежать всех этих ложных импульсов.
Go to the top of the page
 
+Quote Post
MaslovVG
сообщение Dec 7 2011, 07:23
Сообщение #294


Профессионал
*****

Группа: Свой
Сообщений: 1 210
Регистрация: 24-01-05
Из: Россия Волгодонск
Пользователь №: 2 134



Цитата(RW6MKA @ Dec 7 2011, 10:45) *
Но не добавлять же ещё один провод. Тогда проще валкодер вообще подключить отдельными проводами. Вопрос и стоял в том, что бы программно избежать всех этих ложных импульсов.

Любое переключение реле неизбежно будет приводить к появлению лишней пачки импульсов. Введение защитных пауз (запрет счета) к пропаданию импульсов. Причем если двигатель колекторный, то будут возникать помехи от искрения на колеторе. Прокладывайте 4-х жильный кабель.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 7 2011, 07:42
Сообщение #295


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Но подождите... вернусь к тому же интерфейсу DiSEqC
там и питание, и передача данных. По коаксиалу. Ничего не глючит. Возможно потому, что импульсы передаются пачками тоновых посылок 22КГц с определенной длительностью?
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 7 2011, 22:56
Сообщение #296


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Я считаю, что с учетом полученного опыта нужно пересматривать весь проект. Начиная от требований.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Jan 21 2012, 11:39
Сообщение #297


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Доброго всем времени. Схожий код и не пойму в чём проблема.
CODE

if (!(PIND&1 << Button_Run)) {
_delay_ms(100);//защита от дребезга
TCNT1=0;//обнуляем регистр TCNT1
TCCR1B = 0x05; //clk 1024, запуск таймера
while (Run_Time < (Selekt_Time*60)) {

Run();
}
OffBit(PORTD,Run_R);//выключаем
OffBit(PORTD,Run_L);//двигатель
TCCR1B = 0x00;//останавливаем счётчик
Selekt_Time = 0;
Run_Time = 0;
}
........................
void Run (void) {
Time_Sec = 0;
OnBit(PORTD,Run_R);//включаем вращение вправо
while (Time_Sec < 6); //задержка на 6сек

OffBit(PORTD,Run_R);//выключаем вращение
Time_Sec = 0;
while (Time_Sec < 2);

OnBit(PORTD,Run_L);//вкл вращение влево
Time_Sec = 0;
while (Time_Sec <6);

OffBit(PORTD,Run_L);//выкл вращение
Time_Sec = 0;
while (Time_Sec < 2);


}
..........................................
ISR(TIMER1_COMPA_vect) { //прерывание по совпадению таймера-счётчика1 канал А
TCNT1 = 0; //сбросить счётчик таймера1
Run_Time ++;
Time_Sec ++;
}

выполнение доходит до первого прерывания и прерывания следуют подряд не возвращаясь к коду, при этом переменные исправно увеличиваются, но выполнение условий не проверяется. До этого вместо циклов для задержки использовал кучу _delay_ms(1000) и всё работало.

Сообщение отредактировал RW6MKA - Jan 22 2012, 06:02
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Jan 22 2012, 13:06
Сообщение #298


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Ну что, никто не подскажет в чём проблема?
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 22 2012, 20:25
Сообщение #299


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Переменные Run_Time и Time_Sec точно volatile?
Переменные длиной больше одного байта? Тогда как минимум не беспечивается атомарность их изменений(при обнулении может произойти прерывание).
Таймер действительно тикает раз в секунду?

А вообще мне не нравится ваш дизайн. Я бы не трогал таймерную переменную за пределами прерывания. Если хочется засечь время - нужно засечь значение Time_Sec в какой-нибудь локальной переменной(start_time например). Тогда пройденное время будет = Time_Sec - start_time.
Проблема переполнения Time_Sec не проблема при использовании беззнакового типа.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Jan 23 2012, 04:39
Сообщение #300


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Цитата
Переменные Run_Time и Time_Sec точно volatile?

Ну ёлы-палы, опять на эти же грабли))))))) Всё работает, спасибо.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 13th August 2025 - 14:20
Рейтинг@Mail.ru


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