|
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
|
|
| 09.12.2011, 14:08 | |
|
Ответы с готовыми решениями:
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
|
|
| 10.12.2011, 00:53 | |
|
Помогаю со студенческими работами здесь
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(), которая. . .
|