Jump to content

Search the Community

Showing results for tags 'interrupts'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
  • Радиоэлектроника для профессионалов
    • Световые эффекты и LED
    • Роботы и модели на ДУ-управлении
    • Автоматика
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Автомобильная электроника
    • Системы охраны и наблюдения. Личная безопасность
    • Питание
    • Электрика
    • Промышленная электроника
    • Ремонт
    • Металлоискатели
    • Измерительная техника
    • Мастерская радиолюбителя
    • Сотовая связь
    • Спутниковое ТВ
    • КВ и УКВ радиосвязь
    • Жучки
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • Справочная радиоэлементов
    • Литература
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
  • Товары и услуги
  • Разное
  • Переделки's ATX->ЛБП
  • Переделки's разные темы
  • Киловольты юмора's Юмор в youtube

Blogs

There are no results to display.

There are no results to display.

Marker Groups

  • Пользователи форума

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


ICQ


Skype


Интересы


Город


Сфера радиоэлектроники


Оборудование

Found 1 result

  1. Пишу прошивку для управления всяким с пульта от телека, столкнулся с непонятным мне поведением программы (об этом ниже). Прошивка: #define F_CPU 4800000L // 4.8 Мгц #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define INVERT_PIN(x) PORTB ^= x /* PB2 (7) - реле (ВЫХОД). PB1 (PCINT1) (6) - ИК-приёмник (ВХОД). PB0 (PCINT0) (5) - сенсорная панель (ВХОД). PB3 (2) - светодиод (ВЫХОД). PB4 (PCINT4) (3) - кнопка (ВХОД). */ volatile char is_sensor_active = 0; volatile unsigned int rc_code = 0; volatile unsigned int etalon_rc_code = 0; // http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__util__delay_1gad22e7a36b80e2f917324dc43a425e9d3.html // 262.14 / 4.8 = 54.61 мс - это максимальная задержка для данной частоты, до которой можно использовать _delay_ms. void delay_ms(unsigned int period) { while(--period) { _delay_ms(1); } } ISR(PCINT0_vect) { is_sensor_active = 1; } int main() { DDRB = 0b00001100; // Срабатывание прерывания при смене логического уровня на ножках. MCUCR = 0b00000001; // Прерывание генерятся при изменении уровня на ножках. GIMSK = 0b00100000; // Выбор генерящих прерывание пинов. PCMSK = 0b00000010; sei(); while(1) { if( is_sensor_active ) { cli(); rc_code = 0; for( int i = 0; i < sizeof(rc_code) * 8; ++i) { rc_code = (rc_code << 1) + ((PINB & 0b00000010) >> 1); _delay_ms(16); } if( etalon_rc_code == 0) etalon_rc_code = rc_code; if( etalon_rc_code == rc_code) { INVERT_PIN(0b00000100); } else { for( int i = 0; i < 10; ++i) { INVERT_PIN(0b00001000); _delay_ms(30); } } is_sensor_active = 0; delay_ms(240); sei(); } } return 0; } Как я ожидаю она должна работать: как только на ножке 6 сменится логический уровень, с ножки же 6 будет считано четырехбайтовое беззнаковое целое, принято за эталон команды и на ножке 7 установится лог. 1. При повторном зажигании прерывания снова будет считана команда, сравнена с эталонной и, если совпадает, инвертируется ножка 7. В противном случае помигать ножкой 2. Как оно на самом деле работает: вне зависимости от была ли команда верной или нет, контроллер дергает ножкой 2. Отсюда я делаю вывод, прерывание почему-то зажигается дважды. Но ведь не должно же! Вопрос: что же я упустил, приводящее к такому поведению? При обработке команды я прерывания запрещаю же, потом обратно включаю.
×
×
  • Create New...