-
Постов
2 802 -
Зарегистрирован
-
Посещение
-
Победитель дней
19
Тип контента
Профили
Форумы
Блоги
Весь контент ARV
-
Вам нужно разделять процесс управления ШИМ-ом и процесс формирования ШИМа. Управление делается в главном цикле, без прерываний (как вариант), генерация же делается по прерываниям. Т.е. главный цикл вторичен, он не мешает формированию ШИМа, потому что может быть прерван в любой момент. Поэтому в главном цикле в можете прекрасно использовать любые "медленные" функции вроде printf, делать сколь угодно долгие "тупые задержки" (в циклах) и вообще тратить ресурсы, как угодно. // где-то у вас есть код, где по прерываниям от таймера делаются выборки из массива синусов для управления ШИМ-ом // а здесь только та часть, которая ШИМ-ом управлеяет. uint8_t get_buton(void){ // в этой функции вы опрашиваете кнопки, давите дребезг // и возвращаете код нажатой кнопки } // а вот так выглядит ваш главный цикл while(1){ switch(get_button()){ case BTN_STOP: // кнопка "стоп" // здесь меняете переменные так, чтобы ШИМ выключился (или как вы там останавливаете) printf("STOP\n"); break; case BTN_FORWARD: // кнопка "вперед" // здесь задаете параметры ШИМа для разгона в одну сторону printf("FORWARD\n"); break; case BTN_REVERSE: // кнопка "назад" // здесь, очевидно, настраиваете ШИМ для вращения в обратную сторону printf("REVERSE\n"); break; } // далее делаете остальное, что надо в главном цикле } Как-то так в общих чертах. И никаких прерваний для кнопок, никаких printf-ов внутри обработчика прерываний, никаких задержек в прерываниях. Да, еще логичнее по кнопкам менять состояния в автомате состояний, если вы понимаете, о чем я, ведь процесс смены направления вращения должен быть растянут во времени... Поэтому логично не просто настраивать ШИМ, а менять его параметры плавно, пока не будет достигнута нужная скорость. Но это уже детали.
- 8 951 ответ
-
- Микроконтроллер
- МК
-
(и ещё 2 )
C тегом:
-
https://t.me/rt_russian/45273 Документы, говорите, предъявлять нужно?
-
https://t.me/rt_russian/45273 Документы, говорите, предъявлять нужно?
-
Сколько там это "противостояние" длится? Месяц уже? Значит, как минимум 3000 арестованных должно быть, а если верить "сотням", то ближе к 10000. Интересно, способны ли местные околотки вместить столько заключенных?
-
Ничего новенького, все по методичке: спровоцировать и снять на видео. Крайне лицемерно, между прочим, требовать показать удостоверение, в котором есть персональные данные работника полиции, и при этом эти самые данные затем использовать для угроз им и их семьям. Неспроста балаклавы стали носить - так ведь?
-
И почему я не удивлен такому результату?
-
Выживание гражданина после отравления его боевым веществом специально обученными людьми так же объявляет наши спецслужбы ни на что не годными. Вроде как наши заявили, что "на нашей территории в организме Навального "новичка" не было". Интересно, откуда он взялся в его организме после пребывания в Германии? Снова опыты на русских людях немцы ставят?!
-
Вы или тему переименуйте, или придерживайтесь её. А то тема про Си и кнопки, а речь пошла про электронику и всякое такое...
-
Проще всего будет заплатить тому, кто за вас все сделает.
-
Вот этот процент и надо сделать самому. Потом 2, потом 3... постепенно нагрузку увеличивать надо. Вам прямо говорят: СДЕЛАЙТЕ САМИ, не ищите готовое! Не найдете все равно на 100% подходящее, снова на 1% споткнетесь и начнете страдать.
-
Мне кажется, вам нужно все-таки заняться изучением Си. Простейшая задача, на 99% уже решенная, вами не может быть доведена до победного конца... Просто копипастя чужой код вы никогда не научитесь ничего делать самостоятельно. У вас же есть студия, в ней можно просимулировать исполнение программы, посмотреть, что происходит НЕ ТАК, как вам надо... Разобраться, что нужно изменить в коде, чтобы СТАЛО ТАК, как нужно... Кто сделает это за вас?!
-
У вас не 8 кнопок? Тогда лишние биты надо маскировать внутри функции get_button();
-
Так правильно или не правильно - это зависит от постановки задачи. Согласен, что обычно между нажатием кнопки и реакцией на это есть этап анализа. Но если хочется поделиться знаниями, надо оставлять "недосказанность", а иначе получится демонстрация знаний. Знания, как таблетку, не примешь, они появляются сами от напряжения мозга.
-
Изначально я хотел показать, как следует делать по самому первому моему совету - с анализом кодов кнопок. Но потом поленился. Хотя и сейчас это можно сделать в порядке обучения. Меня ж критиковали за отсутствие switch - вот, можно и добавить
-
Да. Это никогда не поздно. Да. Но как раз в этом зарыта собака "почему опрос кнопок в отдельной функции" - там легко сделать нужную проверку. Код демонстрационно-учебный, так что я не вижу оснований для его критики.
-
Работает Конкретно вот этот код: #include <avr/io.h> #include <util/delay.h> uint8_t get_button(void){ uint8_t tmp = ~PIND; _delay_ms(10); if(tmp != (uint8_t)~PIND) return 0; else return tmp; } int main(void){ DDRB = 0xFF; // порт светодиодов на выход PORTD = 0xFF; // подтяжки на входы порта кнопок, кнопки на землю uint8_t tmp; uint8_t state = 1; while(1){ PORTB = state; // включаем светодиоды tmp = get_button(); if(tmp) state = tmp; // обновляем состояние } } Компилируется без ошибок:
-
Потому, что ваш код ужасен. После того, как я исправил свой косячок, мой код отлично работает, не хуже вашего. И он прост и понятен.
-
Ну... виноват. Косячок допустил. Но вот так 100% будет работать: #include <avr/io.h> #include <util/delay.h> uint8_t get_button(void){ uint8_t tmp = ~PIND; _delay_ms(10); if(tmp != (uint8_t)~PIND) return 0; else return tmp; } int main(void){ DDRB = 0xFF; // порт светодиодов на выход PORTD = 0xFF; // подтяжки на входы порта кнопок, кнопки на землю uint8_t state = 1; uint8_t tmp; while(1){ PORTB = state; // включаем светодиоды if(tmp = get_button()) state = tmp; // обновляем состояние, если нажата кнопка } } Светодиоды светятся, когда на порту высокий уровень, а кнопки замыкают порт на общий провод.
-
У вас любовь к простыням кода? Те короткие примеры, что вам тут давал я и другие, не подходят, потому что слишком простые и ошибиться в них сложнее?
-
Не знаю, кому в наше время может понадобиться городить свой вариант СВП, но если надо, то можно сделать, как я и говорил, чуть ли не на attiny25 : на ОУ сделать усилитель напряжения с максимумом 30 или сколько там надо вольт, на вход этого усилителя подавать сигнал с R-2R ЦАП на 595-ых регистрах, а на 597-ых регистрах можно сделать 100500 кнопок. Схема будет не сложной, хотя и объемной по числу корпусов. Но стоимость будет копеечная. Ну, конечно, можно и на МК с большим количеством ног и качественным ЦАПом...
-
Потому что хочу помочь вам научиться программировать. Умение читать - это ваш навык, совершенствуйте его. Научитесь читать, научитесь и писать тоже.