Форум программистов, компьютерный форум, киберфорум
Электроника и радиотехника
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/22: Рейтинг темы: голосов - 22, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 23.11.2011
Сообщений: 34

прерывания

09.12.2011, 14:08. Показов 4315. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Решил попробовать сделать внешие прерывания. Вот код.
#ymstude <avr/io.h>
#ymstude <util/delay.h>
#ymstude <avr/interrupt.h>

ISR(INT0_vect)
{
if (PIND == PIND&0xFE)
{
PORTA = 0xFF;
_delay_ms(200);
PORTA = 0x00;
}
else
{
PORTA = 0xFF;
}
}
int main(void)
{
PORTD = 0x00;
DDRD = 0x00;
PORTA = 0xFF;
DDRA = 0xFF;
TCCR0 = 0x05;
TCNT0 = 0x00;
ACSR = 0x80;
GICR = 1 << 6;
sei();
while (1)
{
PORTA = 0x00;
}
ну вот тут задача такая. Светодиоды не горят. Как нажимаешь на кнопку, соединенную с выводом INT0 должны гореть светодиоды. Вот. Я не понимаю, в даташите прочитал, что для разрешения внешних прерываний нужно выставить бит 6 в единицу. Что я и сделал. А на деле получается, что у меня программа сразу уходит в обработку прерываний. Светодиоды горят. Что у меня не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.12.2011, 14:08
Ответы с готовыми решениями:

Вызов прерывания в обработке прерывания
В программе,нажатие кнопки вызывает прерывание,в котором оно обрабатывается.Попутно в обработке этого прерывания запускается таймер по...

Прерывания
Народ заказал себе девайс, UNO R3 Development Board Microcontroller MEGA328P ATMEGA16U2 Compat for Arduino. скачал прогу 1.6.0, до этого...

Прерывания
Здравствуйте. С горем пополам с немалой помощью умов этого форума удалось мне собрать свой проект. Но на финальном этапе возникла трудность...

5
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
09.12.2011, 23:24
Ну, начнет с того, что вот это:
PORTD = 0x00;
DDRD = 0x00;
Полная фигня. На что порт настроен? На Hi-Z в условиях подключенной кнопки без подтяжки (а на PB именно они) на входе будет полна фигня. Наводки будут телепать его как попало. Так что смысла нет. Надо DDR в 0, а порт в 1, тогда будет вход с подтяжкой.

TCCR0 = 0x05;
TCNT0 = 0x00;
ACSR = 0x80;
GICR = 1 << 6;

А вот за это надо сразу бить ногами. Отучайтесь писать нигическими числами. Ни к чему хорошему это никогда не приводило. Что за бит 6? что за число 05? Что за 0х80? Никто даташит наизусть не знает, где какой бит лежит не помнит и ради вас лезть и выяснять не будет. У каждого бита есть свое символическое имя. Вот его и надо использовать.

if (PIND == PIND&0xFE)

Странный ход. Поясните чего вы хотели им добиться. PIND может быть совершенно левым, наводки и прочая фигня. Так что ждать TRUE резултата сравнения с каким то конкретным числом можно до второго пришествия. Да и зачем проверять кнопку если код в нее и так нее вошел по прерыванию? Опять же, что за 0xFE ?

А что у вас происходит:

Левая наводка дрыгает хаотично порт отвечающий за инт. Он не подтянут, так что легко поддается. Срабатывает прерывание, а в нем идет сравнение с условием которое практически всегда FALSE (ну разве что вам оооочень повезет, а с таким везеньем чего вы тут делаете? Бегом покупать лотерейные билеты!) Соответсвтенно вариант у нас только один остается PORTA = 0xFF;

Опять же вы их же и зажигаете при инициализации.
PORTA = 0xFF;
DDRA = 0xFF;

Так что они будут гореть и вне зависимости от прихода прерывания.
0
0 / 0 / 0
Регистрация: 23.11.2011
Сообщений: 34
10.12.2011, 00:32
Спасибо, понял ошибки. Буду работать над собой и исправлять. Такого больше не повторится :)
0
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
10.12.2011, 00:37
И разберитесь с битмасками. В вашем случае, следуя вашей изначальной задумке должно быть так:

if (PIND&0xFE)

все, ничего более не надо. Будет бит 0 в PIND = 1 будет TRUE. Не будет - FALSE

Наоборот, соответственно:
if (~(PIND&0xFE))
0
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
10.12.2011, 00:38
а вообще где то в дебрях WINAVR есть удобные макросы bit_is_set(byte,bit) и bit_is_clear(byte,bit)
0
0 / 0 / 0
Регистрация: 23.11.2011
Сообщений: 34
10.12.2011, 00:53
Спасибо) Буду разбираться. Я просто хочу попробовать внешние прерывания. А так алгоритм можно и без прерываний реализовать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.12.2011, 00:53
Помогаю со студенческими работами здесь

Прерывания
Ситуация следующая. Есть двигатель, к нему прилеплена оптопара(светодиод-фототранзистор). Нужно количество оборотов в 500 мс отправлять...

Прерывания
Здравствуйте, такая проблема: Контроллер ATMega32, при нажатии на кнопку, подключенную к PD2/INT0 должно срабатывать прерывание инт0, но...

Прерывания
Подскажите пожалуйста. Использую дискавери F4 Настроил внешние прерывания. В обработчик прерывания заходит. Но если посмотреть...

Прерывания
Добрый день подскажите вот я включаю прервания и настраиваю приоритет (у всех один): /* заполнение структуры модуля прерываний */ ...

Прерывания на портах.
Здравствуйте. У меня вопрос возможно ли обработка прерывания на каких либо портах по мимо INT0 и INT1? Ну вот например мне нужно завершить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru