|
|
  |
Изменение текста программы при смене компилятора и чипа |
|
|
|
Dec 5 2011, 13:15
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 5 2011, 15:11
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Цитата(Палыч @ Dec 5 2011, 19:01)  Как только программа попала на JMP в таблице векторов - так сразу и "interrupt routine is executed". Ага, значит если импульс был не один то пока идёт обработка первого прерывания уже установлен флаг второго?
|
|
|
|
|
Dec 5 2011, 16:27
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Цитата(Палыч @ Dec 5 2011, 19:22)  Да. Об этом выше я и говорил. Да, это именно то, что портило мне спокойный сон))) После принудительной очистки флага перед выходом из обработчика всё стало почти отлично, а когда флаг стал очищать и перед циклом поворота(видимо в момент включения реле и соответственно подачи питания на валкодер проходил какойто импульс который "взводил" флаг) жизнь вошла в своё русло)))
|
|
|
|
|
Dec 7 2011, 06:45
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Цитата(MaslovVG @ Dec 5 2011, 21:25)  Всетаки обратите внимание на мой пост 283. Земляной провод сигнала DATA в зависимости от напрвления вращения двигателя проходит через разные диоды моста BR2 разные контакты реле К2, а в состоянии стоп двигателя, вообще висит в воздухе. Причем по этой же цепи течет ток двигателя. Наличие ложных сигналов на DATA просто неизбежно. Но не добавлять же ещё один провод. Тогда проще валкодер вообще подключить отдельными проводами. Вопрос и стоял в том, что бы программно избежать всех этих ложных импульсов.
|
|
|
|
|
Jan 21 2012, 11:39
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 23 2012, 04:39
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Цитата Переменные Run_Time и Time_Sec точно volatile? Ну ёлы-палы, опять на эти же грабли))))))) Всё работает, спасибо.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|