Нескольно простых вопросов о программировании AVR на Си.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Нескольно простых вопросов о программировании AVR на Си.
чудной... сначала в прерывании вызвал инит_пвм, потом в инит_пвм прописал окр0а=0 т.е. при каждом обороте инт'а он сначала чистится, потом опять записывается...
так и не понял, кто у тебя i сбрасывает обратно, только в майне ещё перед тем как всё останавливать, проверь что кнопка отпущена.
зачем тебе разрешать прерывания в прерыввнии и ничего при этом не делать? при выходе из прерывания компилер и сам их разрешит, а так ты можешь стек сорвать (новое прерыввние будет вызываться внутри предыдущего...
______
если кроме пвм'а мк больше ничем не занят, то и прерывание тебе никчему, просто в цикле майна проверяй нажатие кнопки и пока нажата делай свой старт_пвм, иначе {стоп_пвм; и=0;};
это так беглым взглядом...
так и не понял, кто у тебя i сбрасывает обратно, только в майне ещё перед тем как всё останавливать, проверь что кнопка отпущена.
зачем тебе разрешать прерывания в прерыввнии и ничего при этом не делать? при выходе из прерывания компилер и сам их разрешит, а так ты можешь стек сорвать (новое прерыввние будет вызываться внутри предыдущего...
______
если кроме пвм'а мк больше ничем не занят, то и прерывание тебе никчему, просто в цикле майна проверяй нажатие кнопки и пока нажата делай свой старт_пвм, иначе {стоп_пвм; и=0;};
это так беглым взглядом...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Нескольно простых вопросов о программировании AVR на Си.
Ivanoff-iv
Благодарю за ответ. Пробовал через опрос кнопки - совсем не работает. Поэтому решил через прерывание зайти
Благодарю за ответ. Пробовал через опрос кнопки - совсем не работает. Поэтому решил через прерывание зайти
Код: Выделить всё
while(1)
{
if(!(PINB&0b00000010))
{
start_pwm();
}
else
{
stop_pwm();
i=0;
}
}
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Работать с кнопкой черезвнешнее прерывание - глупо.
1. Для кнопки не нужно такое быстродействие. Для неё достаточно опроса раз в 20-50 mS. Даже если это будет кнопка аварийного останова какого-нибудь чудо агрегата
2. Обработка внешним прерыванием накладывает ряд проблем, одна из которых - дребезг.
3. Слишком жирно выделять кнопке целый периферийный модуль. Облезет.
4. Если кнопок будет больше, чем ног, способных на прерывание, то Вы зайдёте в тупик.
5. Внешним прерыванием можно обработать только событие (нажалась/отжалась) кнопки. Про обработку длительных нажатий можете забыть.
6. Ой, устал писать ....
1. Для кнопки не нужно такое быстродействие. Для неё достаточно опроса раз в 20-50 mS. Даже если это будет кнопка аварийного останова какого-нибудь чудо агрегата
2. Обработка внешним прерыванием накладывает ряд проблем, одна из которых - дребезг.
3. Слишком жирно выделять кнопке целый периферийный модуль. Облезет.
4. Если кнопок будет больше, чем ног, способных на прерывание, то Вы зайдёте в тупик.
5. Внешним прерыванием можно обработать только событие (нажалась/отжалась) кнопки. Про обработку длительных нажатий можете забыть.
6. Ой, устал писать ....
Re: Нескольно простых вопросов о программировании AVR на Си.
Работать с кнопкой черезвнешнее прерывание - глупо.
1. Для кнопки не нужно такое быстродействие. Для неё достаточно опроса раз в 20-50 mS. Даже если это будет кнопка аварийного останова какого-нибудь чудо агрегата
2. Обработка внешним прерыванием накладывает ряд проблем, одна из которых - дребезг.
3. Слишком жирно выделять кнопке целый периферийный модуль. Облезет.
4. Если кнопок будет больше, чем ног, способных на прерывание, то Вы зайдёте в тупик.
5. Внешним прерыванием можно обработать только событие (нажалась/отжалась) кнопки. Про обработку длительных нажатий можете забыть.
6. Ой, устал писать ....
1. Для кнопки не нужно такое быстродействие. Для неё достаточно опроса раз в 20-50 mS. Даже если это будет кнопка аварийного останова какого-нибудь чудо агрегата
2. Обработка внешним прерыванием накладывает ряд проблем, одна из которых - дребезг.
3. Слишком жирно выделять кнопке целый периферийный модуль. Облезет.
4. Если кнопок будет больше, чем ног, способных на прерывание, то Вы зайдёте в тупик.
5. Внешним прерыванием можно обработать только событие (нажалась/отжалась) кнопки. Про обработку длительных нажатий можете забыть.
6. Ой, устал писать ....
Хоть и туго, но я это и сам понимаю. Знаний маловато в этой теме, но я пытаюсь. Так, поморгать светодиодами и т.д. - не проблема. Да и тут вроде задачка простейшая, но вот уперся в стену. Сначала пробовал через опрос кнопки- ничего не получается. Ради интереса , зашел через прерывание, там хоть какой-то результат получился и в Протеусе и в железе. Но не совсем то, что нужно. Чутье подсказывает, что где-то косячу в коде с кнопкой (выше выкладывал кусок) Может надо дополнительно переменную ввести или еще что!?. Поэтому и прошу подсказку .
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Ваша проблема намного сложнее.
1 - Проектирование сверху вниз. Устройство. Дробление устройства на модули.
2 - Время реакции системы. Время реакции отдельных модулей.
3 - Модульность программ.
Программу нужно разделить на модули. Опрос кнопок - отдельный модуль. ШИМ - отдельный модуль. Сам алгоритм программы - отдельный модуль.
1 - Опрос кнопок. Кнопки - человекоинтерфейс. То есть медленный. Временные рамки - десятки и сотни миллисекунд. Внешнее прерывание для опроса кнопок есть смысл использовать только в единственном случае - энергосбережение.
2 - Взаимодействие модулей.
3 - Автоматное программирование.
При использовании такого подхода и правил создание любых проектов ускоряется в разы. Программа собирается как конструктор из кубиков-модулей.
На данный момент вы оперируете примитивами-процедурами. При наработке правил, подходов вы уже оперируете "макросами".
1 - Проектирование сверху вниз. Устройство. Дробление устройства на модули.
2 - Время реакции системы. Время реакции отдельных модулей.
3 - Модульность программ.
Программу нужно разделить на модули. Опрос кнопок - отдельный модуль. ШИМ - отдельный модуль. Сам алгоритм программы - отдельный модуль.
1 - Опрос кнопок. Кнопки - человекоинтерфейс. То есть медленный. Временные рамки - десятки и сотни миллисекунд. Внешнее прерывание для опроса кнопок есть смысл использовать только в единственном случае - энергосбережение.
2 - Взаимодействие модулей.
3 - Автоматное программирование.
При использовании такого подхода и правил создание любых проектов ускоряется в разы. Программа собирается как конструктор из кубиков-модулей.
На данный момент вы оперируете примитивами-процедурами. При наработке правил, подходов вы уже оперируете "макросами".
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: Нескольно простых вопросов о программировании AVR на Си.
По IARу есть спецы?
В общем чет я в ступор упал. Захотел в проекте вектора использовать, делаю инклюд <vector>, а оно ошибками на неизвестный тип _ULONGLONG сыпет.
Задефайнить самому то не проблема, но хотелось бы по правильному проблему решить.
P.S. отбой котаны, мой косяк - видимо когда-то делал поиск с заменой и случайно похреначил родные иаровские хидеры. Нашел проблему.
В общем чет я в ступор упал. Захотел в проекте вектора использовать, делаю инклюд <vector>, а оно ошибками на неизвестный тип _ULONGLONG сыпет.
Задефайнить самому то не проблема, но хотелось бы по правильному проблему решить.
P.S. отбой котаны, мой косяк - видимо когда-то делал поиск с заменой и случайно похреначил родные иаровские хидеры. Нашел проблему.
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: Нескольно простых вопросов о программировании AVR на Си.
Кто знает как при помощи time.h конвертировать время в юникс и наоборот?
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: Нескольно простых вопросов о программировании AVR на Си.
Всем привет пытаюсь разобраться как пользоваться библиотекой LCD для вывода информации на дисплей и не получается скомпилировать проект в программе AVR STUDIO 6.0. Пишит как на снимки в чем может быть ошибка. Также скидываю файл прошивки целиком.
- Вложения
-
- Mega_LCD.rar
- (54.89 КБ) 252 скачивания
-
- 124кот.png
- (166.14 КБ) 629 скачиваний
- afz
- Опытный кот
- Сообщения: 744
- Зарегистрирован: Сб дек 22, 2012 08:17:42
- Откуда: Караганда, Казахстан
Re: Нескольно простых вопросов о программировании AVR на Си.
А какой МК ?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
- afz
- Опытный кот
- Сообщения: 744
- Зарегистрирован: Сб дек 22, 2012 08:17:42
- Откуда: Караганда, Казахстан
Развернуть байт в последовательность битов
А как эффективно развернуть байт в последовательность битов с целью передать его через "дрыгоножество" ? Проверить очередной бит на асме - две команды, ASL и BRCS. А на Си? Пока ничего не приходит в голову, кроме, как сдвигать бит маски (0x80). Заодно он и послужит концом цикла... Задача - выплюнуть байт из программы прерывания в 74HC595, поэтому хочется, чтобы она была предельно короткой.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Нескольно простых вопросов о программировании AVR на Си.
цикл 8 раз
{
если (байт и 0х80) отправим 1 иначе 0
байт<<1
}
байт конечно пострадает, но будет отправлен (кстати туь
тже в него и принимать можно
{
если (байт и 0х80) отправим 1 иначе 0
байт<<1
}
байт конечно пострадает, но будет отправлен (кстати туь
тже в него и принимать можно
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Развернуть байт в последовательность битов
А как эффективно развернуть байт в последовательность битов с целью передать его через "дрыгоножество" ?
Эффективность платформозависима - лучше попросите накидать вариантов и выберите из них тот, что ваш компилятор лучше всего соптимизирует.
Проверить очередной бит на асме - две команды, ASL и BRCS. А на Си?
Капитан скажет
Код: Выделить всё
0 != m & bПока ничего не приходит в голову, кроме, как сдвигать бит маски (0x80). Заодно он и послужит концом цикла...
Ну где-то так, да:
Код: Выделить всё
for (unsigned char mask = 0x80; 0 != mask; mask >>= 1)
0 != mask & byte;
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Отмечу ещё, что сдвиг байта по константной маске занимает меньше места во flash, чем сдвиг маски по байту.
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: Нескольно простых вопросов о программировании AVR на Си.
for(char i = 0; i < 8; ++i){
PORTX &= ((byte << i) | 0x7F);
}
и байт не пострадает, и на порту только одна ножка будет дрыгаться. Если нужна другая ножка порта, то добавляем еще один сдвиг и меняем маску.
PORTX &= ((byte << i) | 0x7F);
}
и байт не пострадает, и на порту только одна ножка будет дрыгаться. Если нужна другая ножка порта, то добавляем еще один сдвиг и меняем маску.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Нескольно простых вопросов о программировании AVR на Си.
не правильно - если PORTX.7 == 0 то его уже не взвести
тогда уж PORTX=((byte << i) | (~0x10)) & (PORTX | 0x10);
тогда уж PORTX=((byte << i) | (~0x10)) & (PORTX | 0x10);
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Выглядит как костыль.
Наиболее выгодный по размеру кода и скорости - вариант с сдвигом самих данных и проверкой одного бита (0x80 или 0x01 в зависимости от направления сдвига). То, что данные при этом портятся, как правило, не страшно, потому что это обычно аргумент функции, всё равно уничтожаемый при выходе из неё. Т.е. что-то вроде:
Наиболее выгодный по размеру кода и скорости - вариант с сдвигом самих данных и проверкой одного бита (0x80 или 0x01 в зависимости от направления сдвига). То, что данные при этом портятся, как правило, не страшно, потому что это обычно аргумент функции, всё равно уничтожаемый при выходе из неё. Т.е. что-то вроде:
Спойлер
Код: Выделить всё
static void max7219SendByte(uint8_t data)
{
uint8_t i;
for (i = 0; i < 8; i++) {
if (data & 0x80)
SET(MAX7219_DIN);
else
CLR(MAX7219_DIN);
data <<= 1;
CLR(MAX7219_CLK);
asm("nop");
asm("nop");
SET(MAX7219_CLK);
}
}- ibragimnk
- Первый раз сказал Мяу!
- Сообщения: 23
- Зарегистрирован: Пт июн 08, 2012 13:44:35
- Откуда: Семипалатинск
Re: Нескольно простых вопросов о программировании AVR на Си.
Добрый день. Начал изучать Си для AVR В качестве объекта изучения взял вот этот проект: https://www.radiokot.ru/circuit/digital/home/74/ , по причине наличия открытого исходника и необходимости изготовить аналогичный термостат. Но когда перевел исходник в HEX-файл, оказалось что контроллер отказывается "дрыгать ножками".
Сколько не пытался самостоятельно обнаружить ошибку, так и не смог разобраться. Как комилятор использовал программу Code Vision AVR. Если можно подскажите где может быть ошибка в данном проекте.
- Вложения
-
- 01.rar
- В архиве имеется файл-симуляция в Протеусе
- (90.23 КБ) 245 скачиваний
Днем не спишь, ночью не ешь - конечно устаешь.
- GubaRewa
- Это не хвост, это антенна
- Сообщения: 1306
- Зарегистрирован: Вс янв 15, 2012 13:58:35
- Откуда: Моздок
Re: Нескольно простых вопросов о программировании AVR на Си.
1. Как правильно называется язык Си, на котором программируются контроллеры AVR (Atmega8 в частности) через программную среду AVR Studio 4 и 5? Что это - С, С++, С# или какая-то другая разновидность языка Си?
2. Не могу понять синтаксис этого долбаного языка.
2. Не могу понять синтаксис этого долбаного языка.
На каком языке этот код, что не принимает MVS-2017? Находит 6 ошибок.
- Вложения
-
- Fehler.jpg
- Скриншот из Visual Studio 2017
- (59.83 КБ) 451 скачивание
Я рожден при Сталине, когда паразиты были изгоями общества! 
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
<iostream> - это C++. Пример с типичным "Hello world"