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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

чудной... сначала в прерывании вызвал инит_пвм, потом в инит_пвм прописал окр0а=0 т.е. при каждом обороте инт'а он сначала чистится, потом опять записывается...
так и не понял, кто у тебя i сбрасывает обратно, только в майне ещё перед тем как всё останавливать, проверь что кнопка отпущена.
зачем тебе разрешать прерывания в прерыввнии и ничего при этом не делать? при выходе из прерывания компилер и сам их разрешит, а так ты можешь стек сорвать (новое прерыввние будет вызываться внутри предыдущего...
______
если кроме пвм'а мк больше ничем не занят, то и прерывание тебе никчему, просто в цикле майна проверяй нажатие кнопки и пока нажата делай свой старт_пвм, иначе {стоп_пвм; и=0;};
это так беглым взглядом...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
mobileman
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Пн апр 02, 2012 15:38:07

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

Сообщение mobileman »

Ivanoff-iv
Благодарю за ответ. Пробовал через опрос кнопки - совсем не работает. Поэтому решил через прерывание зайти :)

Код: Выделить всё

while(1)
   {
            
     if(!(PINB&0b00000010))
        
       {
          start_pwm();
         
       }
     else
     {
      stop_pwm();
      i=0;
      }
    }
   
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

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

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

Сообщение mobileman »

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

Хоть и туго, но я это и сам понимаю. Знаний маловато в этой теме, но я пытаюсь. Так, поморгать светодиодами и т.д. - не проблема. Да и тут вроде задачка простейшая, но вот уперся в стену. Сначала пробовал через опрос кнопки- ничего не получается. Ради интереса , зашел через прерывание, там хоть какой-то результат получился и в Протеусе и в железе. Но не совсем то, что нужно. Чутье подсказывает, что где-то косячу в коде с кнопкой (выше выкладывал кусок) Может надо дополнительно переменную ввести или еще что!?. Поэтому и прошу подсказку .
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

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

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

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

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

На данный момент вы оперируете примитивами-процедурами. При наработке правил, подходов вы уже оперируете "макросами".
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

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

Сообщение Ярослав555 »

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

P.S. отбой котаны, мой косяк - видимо когда-то делал поиск с заменой и случайно похреначил родные иаровские хидеры. Нашел проблему.
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

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

Сообщение Ярослав555 »

Кто знает как при помощи time.h конвертировать время в юникс и наоборот?
Аватара пользователя
strengerst
Вымогатель припоя
Сообщения: 516
Зарегистрирован: Пт янв 18, 2013 15:11:02

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

Сообщение strengerst »

Всем привет пытаюсь разобраться как пользоваться библиотекой 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 на Си.

Сообщение afz »

А какой МК ?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Аватара пользователя
afz
Опытный кот
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

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

Сообщение afz »

А как эффективно развернуть байт в последовательность битов с целью передать его через "дрыгоножество" ? Проверить очередной бит на асме - две команды, ASL и BRCS. А на Си? Пока ничего не приходит в голову, кроме, как сдвигать бит маски (0x80). Заодно он и послужит концом цикла... Задача - выплюнуть байт из программы прерывания в 74HC595, поэтому хочется, чтобы она была предельно короткой.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

цикл 8 раз
{
если (байт и 0х80) отправим 1 иначе 0
байт<<1
}
байт конечно пострадает, но будет отправлен (кстати туь
тже в него и принимать можно
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

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

Эффективность платформозависима - лучше попросите накидать вариантов и выберите из них тот, что ваш компилятор лучше всего соптимизирует.
Проверить очередной бит на асме - две команды, 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 на Си.

Сообщение WiseLord »

Отмечу ещё, что сдвиг байта по константной маске занимает меньше места во flash, чем сдвиг маски по байту.
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

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

Сообщение Ярослав555 »

for(char i = 0; i < 8; ++i){
PORTX &= ((byte << i) | 0x7F);
}
и байт не пострадает, и на порту только одна ножка будет дрыгаться. Если нужна другая ножка порта, то добавляем еще один сдвиг и меняем маску.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

не правильно - если PORTX.7 == 0 то его уже не взвести
тогда уж PORTX=((byte << i) | (~0x10)) & (PORTX | 0x10);
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

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

Сообщение Ярослав555 »

да, Вы правы
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

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

Наиболее выгодный по размеру кода и скорости - вариант с сдвигом самих данных и проверкой одного бита (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 на Си.

Сообщение ibragimnk »

Добрый день. Начал изучать Си для 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 на Си.

Сообщение GubaRewa »

1. Как правильно называется язык Си, на котором программируются контроллеры AVR (Atmega8 в частности) через программную среду AVR Studio 4 и 5? Что это - С, С++, С# или какая-то другая разновидность языка Си?

2. Не могу понять синтаксис этого долбаного языка.


На каком языке этот код, что не принимает MVS-2017? Находит 6 ошибок.
Вложения
Fehler.jpg
Скриншот из Visual Studio 2017
(59.83 КБ) 451 скачивание
Я рожден при Сталине, когда паразиты были изгоями общества! :))
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

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

Вернуться в «AVR»