Обсуждаем контроллеры компании Atmel.
Ответить

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт май 31, 2018 21:14:05

чудной... сначала в прерывании вызвал инит_пвм, потом в инит_пвм прописал окр0а=0 т.е. при каждом обороте инт'а он сначала чистится, потом опять записывается...
так и не понял, кто у тебя i сбрасывает обратно, только в майне ещё перед тем как всё останавливать, проверь что кнопка отпущена.
зачем тебе разрешать прерывания в прерыввнии и ничего при этом не делать? при выходе из прерывания компилер и сам их разрешит, а так ты можешь стек сорвать (новое прерыввние будет вызываться внутри предыдущего...
______
если кроме пвм'а мк больше ничем не занят, то и прерывание тебе никчему, просто в цикле майна проверяй нажатие кнопки и пока нажата делай свой старт_пвм, иначе {стоп_пвм; и=0;};
это так беглым взглядом...

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт май 31, 2018 23:23:36

Ivanoff-iv
Благодарю за ответ. Пробовал через опрос кнопки - совсем не работает. Поэтому решил через прерывание зайти :)
Код:
while(1)
   {
            
     if(!(PINB&0b00000010))
        
       {
          start_pwm();
         
       }
     else
     {
      stop_pwm();
      i=0;
      }
    }
   

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт май 31, 2018 23:43:15

Работать с кнопкой черезвнешнее прерывание - глупо.
1. Для кнопки не нужно такое быстродействие. Для неё достаточно опроса раз в 20-50 mS. Даже если это будет кнопка аварийного останова какого-нибудь чудо агрегата :)
2. Обработка внешним прерыванием накладывает ряд проблем, одна из которых - дребезг.
3. Слишком жирно выделять кнопке целый периферийный модуль. Облезет.
4. Если кнопок будет больше, чем ног, способных на прерывание, то Вы зайдёте в тупик.
5. Внешним прерыванием можно обработать только событие (нажалась/отжалась) кнопки. Про обработку длительных нажатий можете забыть.
6. Ой, устал писать ....

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт июн 01, 2018 00:17:17

Работать с кнопкой черезвнешнее прерывание - глупо.
1. Для кнопки не нужно такое быстродействие. Для неё достаточно опроса раз в 20-50 mS. Даже если это будет кнопка аварийного останова какого-нибудь чудо агрегата :)
2. Обработка внешним прерыванием накладывает ряд проблем, одна из которых - дребезг.
3. Слишком жирно выделять кнопке целый периферийный модуль. Облезет.
4. Если кнопок будет больше, чем ног, способных на прерывание, то Вы зайдёте в тупик.
5. Внешним прерыванием можно обработать только событие (нажалась/отжалась) кнопки. Про обработку длительных нажатий можете забыть.
6. Ой, устал писать ....

Хоть и туго, но я это и сам понимаю. Знаний маловато в этой теме, но я пытаюсь. Так, поморгать светодиодами и т.д. - не проблема. Да и тут вроде задачка простейшая, но вот уперся в стену. Сначала пробовал через опрос кнопки- ничего не получается. Ради интереса , зашел через прерывание, там хоть какой-то результат получился и в Протеусе и в железе. Но не совсем то, что нужно. Чутье подсказывает, что где-то косячу в коде с кнопкой (выше выкладывал кусок) Может надо дополнительно переменную ввести или еще что!?. Поэтому и прошу подсказку .

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт июн 01, 2018 04:58:32

Ваша проблема намного сложнее.

1 - Проектирование сверху вниз. Устройство. Дробление устройства на модули.
2 - Время реакции системы. Время реакции отдельных модулей.
3 - Модульность программ.

Программу нужно разделить на модули. Опрос кнопок - отдельный модуль. ШИМ - отдельный модуль. Сам алгоритм программы - отдельный модуль.
1 - Опрос кнопок. Кнопки - человекоинтерфейс. То есть медленный. Временные рамки - десятки и сотни миллисекунд. Внешнее прерывание для опроса кнопок есть смысл использовать только в единственном случае - энергосбережение.
2 - Взаимодействие модулей.
3 - Автоматное программирование.

При использовании такого подхода и правил создание любых проектов ускоряется в разы. Программа собирается как конструктор из кубиков-модулей.

На данный момент вы оперируете примитивами-процедурами. При наработке правил, подходов вы уже оперируете "макросами".

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт июн 01, 2018 14:11:55

По IARу есть спецы?
В общем чет я в ступор упал. Захотел в проекте вектора использовать, делаю инклюд <vector>, а оно ошибками на неизвестный тип _ULONGLONG сыпет.
Задефайнить самому то не проблема, но хотелось бы по правильному проблему решить.

P.S. отбой котаны, мой косяк - видимо когда-то делал поиск с заменой и случайно похреначил родные иаровские хидеры. Нашел проблему.

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср июн 06, 2018 15:07:33

Кто знает как при помощи time.h конвертировать время в юникс и наоборот?

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср июн 27, 2018 10:47:29

Всем привет пытаюсь разобраться как пользоваться библиотекой LCD для вывода информации на дисплей и не получается скомпилировать проект в программе AVR STUDIO 6.0. Пишит как на снимки в чем может быть ошибка. Также скидываю файл прошивки целиком.
Вложения
Mega_LCD.rar
(54.89 KiB) Скачиваний: 235
124кот.png
(166.14 KiB) Скачиваний: 616

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс июл 08, 2018 11:20:46

А какой МК ?

Развернуть байт в последовательность битов

Ср авг 08, 2018 04:07:38

А как эффективно развернуть байт в последовательность битов с целью передать его через "дрыгоножество" ? Проверить очередной бит на асме - две команды, ASL и BRCS. А на Си? Пока ничего не приходит в голову, кроме, как сдвигать бит маски (0x80). Заодно он и послужит концом цикла... Задача - выплюнуть байт из программы прерывания в 74HC595, поэтому хочется, чтобы она была предельно короткой.

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср авг 08, 2018 04:29:10

цикл 8 раз
{
если (байт и 0х80) отправим 1 иначе 0
байт<<1
}
байт конечно пострадает, но будет отправлен (кстати туь
тже в него и принимать можно

Re: Развернуть байт в последовательность битов

Ср авг 08, 2018 08:47:12

А как эффективно развернуть байт в последовательность битов с целью передать его через "дрыгоножество" ?

Эффективность платформозависима - лучше попросите накидать вариантов и выберите из них тот, что ваш компилятор лучше всего соптимизирует.
Проверить очередной бит на асме - две команды, ASL и BRCS. А на Си?

Капитан скажет
Код:
0 != m & b

Пока ничего не приходит в голову, кроме, как сдвигать бит маски (0x80). Заодно он и послужит концом цикла...

Ну где-то так, да:
Код:
for (unsigned char mask = 0x80; 0 != mask; mask >>= 1)
     0 != mask & byte;

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср авг 08, 2018 09:18:39

Отмечу ещё, что сдвиг байта по константной маске занимает меньше места во flash, чем сдвиг маски по байту.

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср авг 08, 2018 09:33:07

for(char i = 0; i < 8; ++i){
PORTX &= ((byte << i) | 0x7F);
}
и байт не пострадает, и на порту только одна ножка будет дрыгаться. Если нужна другая ножка порта, то добавляем еще один сдвиг и меняем маску.

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср авг 08, 2018 10:05:51

не правильно - если PORTX.7 == 0 то его уже не взвести
тогда уж PORTX=((byte << i) | (~0x10)) & (PORTX | 0x10);

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср авг 08, 2018 11:37:02

да, Вы правы

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср авг 08, 2018 11:50:56

Выглядит как костыль.

Наиболее выгодный по размеру кода и скорости - вариант с сдвигом самих данных и проверкой одного бита (0x80 или 0x01 в зависимости от направления сдвига). То, что данные при этом портятся, как правило, не страшно, потому что это обычно аргумент функции, всё равно уничтожаемый при выходе из неё. Т.е. что-то вроде:

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт янв 22, 2019 05:59:51

Добрый день. Начал изучать Си для AVR В качестве объекта изучения взял вот этот проект: https://www.radiokot.ru/circuit/digital/home/74/ , по причине наличия открытого исходника и необходимости изготовить аналогичный термостат. Но когда перевел исходник в HEX-файл, оказалось что контроллер отказывается "дрыгать ножками". :( Сколько не пытался самостоятельно обнаружить ошибку, так и не смог разобраться. Как комилятор использовал программу Code Vision AVR. Если можно подскажите где может быть ошибка в данном проекте.
Вложения
01.rar
В архиве имеется файл-симуляция в Протеусе
(90.23 KiB) Скачиваний: 228

Re: Нескольно простых вопросов о программировании AVR на Си.

Сб фев 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

Re: Нескольно простых вопросов о программировании AVR на Си.

Сб фев 09, 2019 16:37:11

<iostream> - это C++. Пример с типичным "Hello world"
Ответить