Обсуждаем контроллеры компании Atmel.
Чт май 31, 2018 21:14:05
чудной... сначала в прерывании вызвал инит_пвм, потом в инит_пвм прописал окр0а=0 т.е. при каждом обороте инт'а он сначала чистится, потом опять записывается...
так и не понял, кто у тебя i сбрасывает обратно, только в майне ещё перед тем как всё останавливать, проверь что кнопка отпущена.
зачем тебе разрешать прерывания в прерыввнии и ничего при этом не делать? при выходе из прерывания компилер и сам их разрешит, а так ты можешь стек сорвать (новое прерыввние будет вызываться внутри предыдущего...
______
если кроме пвм'а мк больше ничем не занят, то и прерывание тебе никчему, просто в цикле майна проверяй нажатие кнопки и пока нажата делай свой старт_пвм, иначе {стоп_пвм; и=0;};
это так беглым взглядом...
Чт май 31, 2018 23:23:36
Ivanoff-ivБлагодарю за ответ. Пробовал через опрос кнопки - совсем не работает. Поэтому решил через прерывание зайти
- Код:
while(1)
{
if(!(PINB&0b00000010))
{
start_pwm();
}
else
{
stop_pwm();
i=0;
}
}
Чт май 31, 2018 23:43:15
Работать с кнопкой черезвнешнее прерывание - глупо.
1. Для кнопки не нужно такое быстродействие. Для неё достаточно опроса раз в 20-50 mS. Даже если это будет кнопка аварийного останова какого-нибудь чудо агрегата
2. Обработка внешним прерыванием накладывает ряд проблем, одна из которых - дребезг.
3. Слишком жирно выделять кнопке целый периферийный модуль. Облезет.
4. Если кнопок будет больше, чем ног, способных на прерывание, то Вы зайдёте в тупик.
5. Внешним прерыванием можно обработать только событие (нажалась/отжалась) кнопки. Про обработку длительных нажатий можете забыть.
6. Ой, устал писать ....
Пт июн 01, 2018 00:17:17
Работать с кнопкой черезвнешнее прерывание - глупо.
1. Для кнопки не нужно такое быстродействие. Для неё достаточно опроса раз в 20-50 mS. Даже если это будет кнопка аварийного останова какого-нибудь чудо агрегата
2. Обработка внешним прерыванием накладывает ряд проблем, одна из которых - дребезг.
3. Слишком жирно выделять кнопке целый периферийный модуль. Облезет.
4. Если кнопок будет больше, чем ног, способных на прерывание, то Вы зайдёте в тупик.
5. Внешним прерыванием можно обработать только событие (нажалась/отжалась) кнопки. Про обработку длительных нажатий можете забыть.
6. Ой, устал писать ....
Хоть и туго, но я это и сам понимаю. Знаний маловато в этой теме, но я пытаюсь. Так, поморгать светодиодами и т.д. - не проблема. Да и тут вроде задачка простейшая, но вот уперся в стену. Сначала пробовал через опрос кнопки- ничего не получается. Ради интереса , зашел через прерывание, там хоть какой-то результат получился и в Протеусе и в железе. Но не совсем то, что нужно. Чутье подсказывает, что где-то косячу в коде с кнопкой (выше выкладывал кусок) Может надо дополнительно переменную ввести или еще что!?. Поэтому и прошу подсказку .
Пт июн 01, 2018 04:58:32
Ваша проблема намного сложнее.
1 - Проектирование сверху вниз. Устройство. Дробление устройства на модули.
2 - Время реакции системы. Время реакции отдельных модулей.
3 - Модульность программ.
Программу нужно разделить на модули. Опрос кнопок - отдельный модуль. ШИМ - отдельный модуль. Сам алгоритм программы - отдельный модуль.
1 - Опрос кнопок. Кнопки - человекоинтерфейс. То есть медленный. Временные рамки - десятки и сотни миллисекунд. Внешнее прерывание для опроса кнопок есть смысл использовать только в единственном случае - энергосбережение.
2 - Взаимодействие модулей.
3 - Автоматное программирование.
При использовании такого подхода и правил создание любых проектов ускоряется в разы. Программа собирается как конструктор из кубиков-модулей.
На данный момент вы оперируете примитивами-процедурами. При наработке правил, подходов вы уже оперируете "макросами".
Пт июн 01, 2018 14:11:55
По IARу есть спецы?
В общем чет я в ступор упал. Захотел в проекте вектора использовать, делаю инклюд <vector>, а оно ошибками на неизвестный тип _ULONGLONG сыпет.
Задефайнить самому то не проблема, но хотелось бы по правильному проблему решить.
P.S. отбой котаны, мой косяк - видимо когда-то делал поиск с заменой и случайно похреначил родные иаровские хидеры. Нашел проблему.
Ср июн 06, 2018 15:07:33
Кто знает как при помощи time.h конвертировать время в юникс и наоборот?
Ср июн 27, 2018 10:47:29
Всем привет пытаюсь разобраться как пользоваться библиотекой LCD для вывода информации на дисплей и не получается скомпилировать проект в программе AVR STUDIO 6.0. Пишит как на снимки в чем может быть ошибка. Также скидываю файл прошивки целиком.
- Вложения
-
- Mega_LCD.rar
- (54.89 KiB) Скачиваний: 235
-
- 124кот.png
- (166.14 KiB) Скачиваний: 616
Вс июл 08, 2018 11:20:46
А какой МК ?
Ср авг 08, 2018 04:07:38
А как эффективно развернуть байт в последовательность битов с целью передать его через "дрыгоножество" ? Проверить очередной бит на асме - две команды, ASL и BRCS. А на Си? Пока ничего не приходит в голову, кроме, как сдвигать бит маски (0x80). Заодно он и послужит концом цикла... Задача - выплюнуть байт из программы прерывания в 74HC595, поэтому хочется, чтобы она была предельно короткой.
Ср авг 08, 2018 04:29:10
цикл 8 раз
{
если (байт и 0х80) отправим 1 иначе 0
байт<<1
}
байт конечно пострадает, но будет отправлен (кстати туь
тже в него и принимать можно
Ср авг 08, 2018 08:47:12
А как эффективно развернуть байт в последовательность битов с целью передать его через "дрыгоножество" ?
Эффективность платформозависима - лучше попросите накидать вариантов и выберите из них тот, что ваш компилятор лучше всего соптимизирует.
Проверить очередной бит на асме - две команды, ASL и BRCS. А на Си?
Капитан скажет
- Код:
0 != m & b
Пока ничего не приходит в голову, кроме, как сдвигать бит маски (0x80). Заодно он и послужит концом цикла...
Ну где-то так, да:
- Код:
for (unsigned char mask = 0x80; 0 != mask; mask >>= 1)
0 != mask & byte;
Ср авг 08, 2018 09:18:39
Отмечу ещё, что сдвиг байта по константной маске занимает меньше места во flash, чем сдвиг маски по байту.
Ср авг 08, 2018 09:33:07
for(char i = 0; i < 8; ++i){
PORTX &= ((byte << i) | 0x7F);
}
и байт не пострадает, и на порту только одна ножка будет дрыгаться. Если нужна другая ножка порта, то добавляем еще один сдвиг и меняем маску.
Ср авг 08, 2018 10:05:51
не правильно - если PORTX.7 == 0 то его уже не взвести
тогда уж PORTX=((byte << i) | (~0x10)) & (PORTX | 0x10);
Ср авг 08, 2018 11:37:02
да, Вы правы
Ср авг 08, 2018 11:50:56
Выглядит как костыль.
Наиболее выгодный по размеру кода и скорости - вариант с сдвигом самих данных и проверкой одного бита (0x80 или 0x01 в зависимости от направления сдвига). То, что данные при этом портятся, как правило, не страшно, потому что это обычно аргумент функции, всё равно уничтожаемый при выходе из неё. Т.е. что-то вроде:
Вт янв 22, 2019 05:59:51
Добрый день. Начал изучать Си для AVR В качестве объекта изучения взял вот этот проект:
https://www.radiokot.ru/circuit/digital/home/74/ , по причине наличия открытого исходника и необходимости изготовить аналогичный термостат. Но когда перевел исходник в HEX-файл, оказалось что контроллер отказывается "дрыгать ножками".
Сколько не пытался самостоятельно обнаружить ошибку, так и не смог разобраться. Как комилятор использовал программу Code Vision AVR. Если можно подскажите где может быть ошибка в данном проекте.
- Вложения
-
- 01.rar
- В архиве имеется файл-симуляция в Протеусе
- (90.23 KiB) Скачиваний: 228
Сб фев 09, 2019 16:32:07
1. Как правильно называется язык Си, на котором программируются контроллеры AVR (Atmega8 в частности) через программную среду AVR Studio 4 и 5? Что это - С, С++, С# или какая-то другая разновидность языка Си?
2. Не могу понять синтаксис этого долбаного языка.
На каком языке этот код, что не принимает MVS-2017? Находит 6 ошибок.
- Вложения
-
- Fehler.jpg
- Скриншот из Visual Studio 2017
- (59.83 KiB) Скачиваний: 438
Сб фев 09, 2019 16:37:11
<iostream> - это C++. Пример с типичным "Hello world"
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.