0 / 0 / 0
Регистрация: 01.11.2021
Сообщений: 14
1

Как сделать так чтобы длительность импульса регулировалось кнопками + и -? МК Atmega328P

04.11.2021, 08:21. Показов 1088. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
идёт прерывание по спадающему фронту на INT0, после 3 прерываний должен последовать импульс регулируемой длины.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
int i = 0;
 
void count()
{
    PORTB = (1<<5);           // импульс вкл
    _delay_us(100);             // длительность импульса 
    PORTB=(0<<5);             // импульс выкл
    
    
}
 
int main(void)
{
    DDRB=0b11111111;
    PORTB=0b00000000;
    EICRA = 0b00000010;       // прерывание по спаду
    EIMSK = 0b00000001;
    sei();
    
    
    while (1)
    
    {
    }
}
 
 
ISR (INT0_vect)  // прерывание INT0
{
 
    i++;
    if (i>=3)
    {
        count();
        i=0;
    }
    
 
 
 
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.11.2021, 08:21
Ответы с готовыми решениями:

Как сделать так, чтобы спад импульса был в 3р дольше (verilog)
Как сделать так, чтобы спад импульса был в 3р дольше(один треугольник) Необходимо чтобы...

Необходимо сделать так, чтобы воздействие генерируемого импульса воздействовало определенное время
Здравствуйте, ситуация такая: задаю внешнее возмущение блоком Pulse Generator. Необходимо сделать...

Не знаю как сделать так чтобы как сделать так чтобы через каждые N строк таблицы выдача результатов останавливалась
from math import * a = -5 b = 10 up = 0.2 N = 15 x = a min_x = a max_x = b while a &lt;= b: ...

Как посчитать длительность Прямоугольного импульса (Меандр)
Доброго времени суток . Поставленная задача : при поступлении сигнала МК должен отсчитывать время...

Как влияет длительность импульса на спектр фаз или амплитуд периодического сигнала?
Вообще может посоветуете, где об этом написано. Уменьшили мы длительность импульса, а фазы начали...

10
2129 / 1212 / 503
Регистрация: 11.10.2018
Сообщений: 6,138
04.11.2021, 10:00 2
Лучший ответ Сообщение было отмечено 21111986 как решение

Решение

Попробуй так:
C
1
2
3
unsigned char volatile i = 100;
//тут ставим длину какую надо
_delay_ms(i);
Добавлено через 21 минуту
Цитата Сообщение от 21111986 Посмотреть сообщение
C
1
int i = 0;
- для этой переменной и unsigned char хватит.
Раз i уже используется, тогда задержка вых. импульса будет d
C
1
unsigned char d = 100;
Цитата Сообщение от 21111986 Посмотреть сообщение
C
1
2
3
while (1)
{
}
вот тут надо будет опрашивать кнопки через PINn там где у Вас кнопки подключены. Сделайте им подтяжку кверху(+5В) и проверяйте кнопки на 0. При 0 увеличивайте или уменьшайте переменную d на 1 или там 5, например.

Добавлено через 2 минуты
Не забываем про операторы
<< сдвиг влево
>> сдвиг вправо
& логическое И.
Это для обработки байт от порта от кнопок.

Добавлено через 35 минут
Цитата Сообщение от 21111986 Посмотреть сообщение
C
1
PORTB=(0<<5);     //импульс выкл
выключение не так, а вот так:
C
1
PORTB &= ~(1<<5);
1
5 / 5 / 0
Регистрация: 25.06.2017
Сообщений: 586
04.11.2021, 12:38 3
Извиняюсь, что так беспардонно влезаю в Вашу тему:
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Сделайте им подтяжку кверху(+5В)
Я правильно понимаю, что после этого PINn этой кнопки/вывода МК будет равен "единичке"?
0
2129 / 1212 / 503
Регистрация: 11.10.2018
Сообщений: 6,138
04.11.2021, 12:43 4
Нет, неправильно, там подключится подтягивающий резистор. Его можно подключить либо снаружи либо внутри записав в PORTC = 1 на соответствующий пин.
0
5 / 5 / 0
Регистрация: 25.06.2017
Сообщений: 586
04.11.2021, 12:55 5
Цитата Сообщение от FFPowerMan Посмотреть сообщение
записав в PORTC = 1 на соответствующий пин.
С этим всё понятно.
Я имею в виду, когда это всё будет сделано, с помощью команды PINn я могу опросить любой порт?
Неважно, включен он на выход или на вход.
И если я опрошу с помощью этой самой команды интересующий меня вывод микроконтроллера, допустим PINС2 или PIND5, я же должен получить в результате, что PINС2 или PIND5 этого вывода равен единичке?
Или я совсем чего-то не понимаю?
0
2129 / 1212 / 503
Регистрация: 11.10.2018
Сообщений: 6,138
04.11.2021, 13:04 6
Цитата Сообщение от Юрий_Нд Посмотреть сообщение
я могу опросить любой порт?
Да.
0
5 / 5 / 0
Регистрация: 25.06.2017
Сообщений: 586
04.11.2021, 13:12 7
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Да.
Извиняюсь, с этим мне всё понятно тоже.
Скажите пожалуйста, то что написано ниже:
--------------------------------------------------------------------
Насколько понимаю, если я вывод микроконтроллера PD0 настроил на вход,
то есть в Регистр направления данных порта D прописал нолик в нулевой бит:
DDRD &= ~(1<<0);
Затем в Регистр данных портa D прописал единичку в нулевой бит,
PORTD |= (1<<0);
тем самым подтянул его резистором к питанию,
после этого, по моему мнению, регистр выводов порта D должен читать единичку с вывода PD0?
PIND0 = 1
--------------------------------------------------------------------
Это всё верно?

Добавлено через 1 минуту
И ещё раз Извините, Вы не могли бы перейти в соседнюю тему:
Запись битов в Регистр выводов порта D
0
2129 / 1212 / 503
Регистрация: 11.10.2018
Сообщений: 6,138
04.11.2021, 13:19 8
Да. Нет.
0
5 / 5 / 0
Регистрация: 25.06.2017
Сообщений: 586
04.11.2021, 15:02 9
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Да. Нет.
А что "да" и что "нет"?
Ничего не понял.
0
0 / 0 / 0
Регистрация: 01.11.2021
Сообщений: 14
04.11.2021, 17:22  [ТС] 10
Спасибо за ответ. Он выдаёт ошибку. Подскажите в чём дело

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int i = 0;
 
 
unsigned char volatile d = 100;   // наша переменная
 
 
 
void count()
{
    
    PORTB=(1<<5);
    _delay_us(d);
    PORTB &= ~(1<<5);
    
 
}
 
int main(void)
{
    DDRB=0b11111111;
    PORTB=0b00000000;
    DDRC=0b0000000;
    PORTC=0b0000011;
    EICRA = 0b00000010;
    EIMSK = 0b00000001;
    sei();
    
    while (1)
    
    {
        if (PINC0 == 0)
        {
            d++;
            _delay_ms(10);
        }
        if (PINC1 == 0)
        {
            d--;
            _delay_ms(10);
        }
        
        
    }
}
 
 
ISR (INT0_vect)
{
    i++;
    if (i>=3)
    {
        count();
        i=0;
    }
}


Error __builtin_avr_delay_cycles expects a compile time integer constant


Как сделать так чтобы длительность импульса регулировалось кнопками + и -? МК Atmega328P
0
2129 / 1212 / 503
Регистрация: 11.10.2018
Сообщений: 6,138
04.11.2021, 17:40 11
Для этого компилятора нужно вставлять константу в функцию _delay_us();
Поэтому, нужно искать другие пути решения изменения длины импульса, например через Таймер0.

Добавлено через 6 минут
Да просто циклом задержку сделай и переменная до которой считает переменная будет.

Добавлено через 41 секунду
int это 2 байта в WinAVR, не забывайте это.

Добавлено через 2 минуты
Просто цикл, который считает до этой переменной и в нем задержка _delay_us(1);
1
04.11.2021, 17:40
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2021, 17:40
Помогаю со студенческими работами здесь

Как сделать так чтобы персонаж был в приорите, так чтобы он не заходил за траву?
Ниже приложил скрин

как сделать чтобы на конец импульса 1 порта включался 2ой порт
задача такова сделать передатчик и приемник симулировать в MPLAB часть кода написал но как...

Длительность импульса
Всем привет, как посчитать длительность импульса ? Задача состоит в определении интеграла вообще,...

Rigidbody2D импульс AddForce() Как сделать, чтобы после импульса объект не падал назад?
Здравствуйте! Даю импульс объекту: rBD.AddForce (new Vector2 (_impulseForce, 0),...

Длительность импульса RESET
Хочу сделать прошивалку по Bluetooth HC-05 для Aduino. Меня интересует можно ли где-то найти...

Измерить длительность импульса
Помогите написать программу: измерить длительность импульса положительной полярности(лог.1)...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как подключить JavaScript файл в другом JavaScript файле
InfoMaster 20.01.2025
В современной веб-разработке организация кодовой базы играет ключевую роль в создании масштабируемых и поддерживаемых приложений. Модульность и правильное структурирование кода стали неотъемлемыми. . .
Как откатить изменения в исходниках, не внесенные в Git
InfoMaster 20.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью отменить внесенные изменения в исходном коде. Особенно актуальной становится ситуация, когда изменения еще. . .
В чем разница между px, in, mm, pt, dip, dp, sp
InfoMaster 20.01.2025
В мире цифрового дизайна и разработки интерфейсов правильный выбор единиц измерения играет ключевую роль в создании качественного пользовательского опыта. История развития систем измерений для. . .
Как изменить адрес удалённого репозитория (origin) в Git
InfoMaster 20.01.2025
В терминологии Git термин origin является стандартным именем для основного удаленного репозитория, с которым взаимодействует локальная копия проекта. Когда разработчик клонирует репозиторий с. . .
Как переместить последние коммиты в новую ветку (branch) в Git
InfoMaster 20.01.2025
При работе над проектом часто возникают ситуации, когда необходимо изолировать определенные изменения от основной линии разработки. Это может быть связано с экспериментальными функциями, исправлением. . .
Как вернуть результат из асинхронной функции в JavaScript
InfoMaster 20.01.2025
Асинхронное программирование представляет собой фундаментальную концепцию в JavaScript, которая позволяет выполнять длительные операции без блокировки основного потока выполнения программы. В. . .
Какой локальный веб-сервер выбрать
InfoMaster 19.01.2025
В современной веб-разработке локальные веб-серверы играют ключевую роль, предоставляя разработчикам надежную среду для создания, тестирования и отладки веб-приложений без необходимости использования. . .
Почему планшеты и iPad уже не так популярны, как раньше
InfoMaster 19.01.2025
Эра революционных инноваций История планшетов началась задолго до того, как эти устройства стали привычными спутниками нашей повседневной жизни. В начале 1990-х годов появились первые прототипы,. . .
Как самому прошить BIOS ноутбука
InfoMaster 19.01.2025
BIOS (Basic Input/ Output System) представляет собой важнейший компонент любого компьютера или ноутбука, который обеспечивает базовое взаимодействие между аппаратным и программным обеспечением. . .
Какой Linux выбрать для домашнего компьютера
InfoMaster 19.01.2025
Современные реалии выбора операционной системы В современном мире выбор операционной системы для домашнего компьютера становится все более важным решением, которое может существенно повлиять на. . .
Как объединить два словаря одним выражением в Python
InfoMaster 19.01.2025
В мире программирования на Python работа со словарями является неотъемлемой частью разработки. Словари представляют собой мощный инструмент для хранения и обработки данных в формате "ключ-значение". . . .
Как без исключения проверить существование файла в Python
InfoMaster 19.01.2025
При разработке программного обеспечения на Python часто возникает необходимость проверить существование файла перед выполнением операций с ним. Это критически важная задача, которая помогает избежать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru