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

Проблема с fast-ШИМ в AtmelStudio7

Пн ноя 18, 2019 21:25:15

Здравствуйте! Я начинающий осваивать AVR, прощу помощи разобраться в проблеме с AtmelStudio7.
Потребовалось отследить выполнение программы использующей режим фаст-ШИМ. В частности режим позволяющий изменять длительность и частоту импульсов, что делается при помощи регистров OCR1A и OCR1B.
Отслеживаю строки при помощи F10 или F11. И вдруг заметил, что строка вида
Код:
OCR1B = <переменная типа unsigned int>

не выполняется при пошаговом режиме.
Стал "копать". В компиляторе отключена оптимизация (-O0), debugging на максимуме (-g3). Строка с присваиванием игнорируется.
Создал для применяемого контроллера Attiny44a пустой проект, где происходит только инициализация Т/С1.
Код:
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1=0x0000;
ICR1=0x0000;
OCR1A=0x00FF;
OCR1B=0x000B;
...

При пошаговом выполнении присвоение OCR1B не происходит, а присвоение регистру OCR1А происходит с задержкой. Однако, сделал чисто для любопытства так:
Код:
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);

программа стала работать как положено - курсор отладчика стоит на OCR1A, нажимаем F10, присваивается значение; курсор на OCR1B, нажимаем F10, присваивается значение.

Что я делаю на так? Что я недопонимаю в работе контроллера/студии?

Стоит добавить, что код своей программы я 1:1 компилировал также в CVAVR и IAR. Обе прошивки работали в Протеусе. Прошивка созданная в AStudio - в Протеусе не работает должным образом.

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 04:36:47

Вы используете режим FAST PWM, который имеет двойное буферирование. Попробуйте прогнать код полностью до TCNT1=OCR1A=FF. Следующим шагом должны увидеть занесение в OCR1B значения из буфера и сброс TCNT1. Правильнее сначала сделать установки режима работы и только потом делать запуск таймера.
Попробуйте
Код:
TCCR1B=0x00
TCNT1=0x0000;
ICR1=0x0000;
OCR1A=0x00FF;
OCR1B=0x000B;

TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (1<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
;TCNT1=0x0000;
;ICR1=0x0000;
;OCR1A=0x00FF;
;OCR1B=0x000B;

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 06:13:58

Что я делаю на так? Что я недопонимаю в работе контроллера/студии?

Не читаете ДШ ) Хоть вам уже и ответили, выдержку с ДШ приведу:
Изображение
Вложения
ocr0x.png
(7.38 KiB) Скачиваний: 594

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 11:18:31

Благодарю за ответы!
Действительно, значение регистра OCR1B всё-таки меняется - заметил это когда нажимаю паузу при "кручении" в бесконечном пустом цикле. Точный момент сейчас отслежу.
Значит, чтобы оперативно изменить значение регистров, мне надо остановить счетчик, изменить регистры и запустить счетчик. Попробую.
Но вот что мне не даёт покоя - почему один и тот же код, но скомпилированнный в CVAVR и IAR работает в Протеусе, а скомпилированный в AStudio - нет???
Ещё наткнулся на данном форуме на такую ссылку: https://forum.cxem.net/index.php?/topic ... 1-atmega8/

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 11:37:01

А что вы имеете в виду под "не работает в Протеусе"? Прям вывод ШИМ не идет или отладка просто не работает? Или еще в чем другом дело?

Кстати,
В компиляторе отключена оптимизация (-O0)

Для отладки лучше включать -Og.

Ну и давайте .elf прикрепляйте, можно будет глянуть что не работает.

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 11:38:35

...Значит, чтобы оперативно изменить значение регистров, мне надо остановить счетчик, изменить регистры и запустить счетчик...
Нет.Смысл буферирования в том, что можно асинхронно менять значения регистров, а выполнение сравнения будет только после завершения предыдущего цикла.

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 12:52:12

Читаем ограничения в разделе симулятора IDE.
Не знаю, как в 7-ке, а в 4.19 тех ограничений было предостаточно.
8)

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 16:06:02

Не дают своими интересными делами на работе позаниматься :)))
Да, и правда регистру OCR1B присвоится новое значение, когда счетчик дойдёт до значения в OCR1A. Проинициализировал Т/С1 и куча _NOP() в столбик.
Для отладки буду знать теперь про опцию -Og. Спасибо!
Ну вот не работает в Протеусе :kill: Файл Протеуса прикрепил. Когда джамперы не установлены, то при нажатии на кнопки (можно и длительно) скважность меняется. При установке джампера, код из CVAVR работает, ШИМ выдается с другой частотой и скважностью. Из AS7 - нет, просто единица на выходе.
Протеус у меня версии 8.4, а CVAVR 3.10.
Вложения
прицеп.zip
(152.08 KiB) Скачиваний: 218

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 18:06:26

Не проще было код привести?

Полагаю, код был написан под CVAVR, вы его переделываете под AS7.

Строка temp = MaxValueSquare[_LightLevel-1] (читаем из флеш памяти) справедлива для CVAVR, но не для AS7.

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 19:46:25

Dimon456 писал(а):Не проще было код привести?

Полагаю, код был написан под CVAVR, вы его переделываете под AS7.

Строка temp = MaxValueSquare[_LightLevel-1] (читаем из флеш памяти) справедлива для CVAVR, но не для AS7.

Без проблем код привести, лучше даже проект целиком приведу.
Совершенно верно - писал на CVAVR, потом перенес на AS и на IAR. Ну чисто так, сравнить hex по размеру, и для освоения.
А как следует правильно сделать?
А как Вы прочитали из флеш памяти? Подскажите, где подробнее посмотреть про отладку, .elf и .cof файлы.
Немного поясню суть своего изделия. Оно управляет яркостью светодиодной линейки посредством ШИМ. Одна кнопка - шажок вверх, другая - шажок вниз. Можно и длительное нажатие - будет постепенно увеличиваться и уменьшаться. А можно и энкодер подвесить и ручкой крутить яркость. Но это про управление. Суть в том, что линейно управлять ШИМом, а вернее коэф.заполнения от 1/255 до 254/255 не айс. Так глаз устроен и вообще органы восприятия человека - закон Вебера-Фехнера. Поиск как правильно надо, дал три варианта ответа - по квадратичной кривой, по кубической и по показательной (обратно логарифмической). Коэф.заполнения будет формироваться как отношение OCR1B/OCR1A, значение которого будет максимально приближенно по значению к кривой регулирования в данной точке. Сто шагов яркости, соответственно рассчитаны два массива значений. А джампером выбираем одну из кривых. Правда я сам ещё одну сообразил (показательная с другим множителем). Так что четыре кривых. А если джампер не стоит, то линейная зависимость. Вот и вся суть кода. Берём значения соответствующие уровню яркости из массива, да суём в регистры. А контроллер сам аппаратно ножкой дрыгает.
Заранее извиняюсь за возможное нехорошее качество кода :)) Всё же учусь, да и мне пока так понятнее. Но выслушаю все замечания и поучения как надо правильно :)

Добавлено after 1 minute 27 seconds:
Читаем ограничения в разделе симулятора IDE.
Не знаю, как в 7-ке, а в 4.19 тех ограничений было предостаточно.
8)

Подскажите где посмотреть, ну чтобы на русском желательно :)
Вложения
CVAVR.zip
Проект в CVAVR.
(89.89 KiB) Скачиваний: 209

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 19:56:58

CVAVR, GCC, IAR - у всех свои нюансы. Проект без модификации не переносится. Разные библиотеки, разные заголовки, разные подходы.

EDIT: Без модификаций странно как он вообще собирается у вас.
Да и не могло собраться ведь. Вот хотя бы из-за этого:
Код:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)

Прерывания не так в avr-gcc прописываются.
Последний раз редактировалось NStorm Вт ноя 19, 2019 20:03:18, всего редактировалось 2 раз(а).

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 19:59:31

Electro_Alex писал(а):Подскажите где посмотреть, ну чтобы на русском желательно
К примеру здесь

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 20:04:39

А, понял. Вы в AS используете CVAVR в кач-ве тулчейна. Я даже не знал, что оно CVAVR как тулчейн может использовать. Только с avr-gcc имел дело. Вполне возможно бага/ограничение интеграции тулчейна в AS какое-то.

Dimon456, по файлам проекта там в Atmel Studio подрублен именно CVAVR проект, с использованием его тулчейна, а не GCC. Так что PROGMEM тут не нужен.

Спойлер
Код:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectVersion>6.1</ProjectVersion>
    <ToolchainName>com.HPInfoTech.CodeVisionAVR.C</ToolchainName>
...

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 20:14:43

CVAVR, GCC, IAR - у всех свои нюансы. Проект без модификации не переносится. Разные библиотеки, разные заголовки, разные подходы.

:)) Ну естественно не абсолютно одинаковы они. Изменены были #include и пути к библиотекам, функции обработки прерываний по-другому названы, всякие sei написаны как требуется в среде и т.п. Поэтому и собралось :) Просто вся, скажем так сишная логика не менялась.
Dimon456 писал(а):
Electro_Alex писал(а):Подскажите где посмотреть, ну чтобы на русском желательно
К примеру здесь

Благодарю! Ознакомлюсь.

Добавлено after 4 minutes 24 seconds:
А, понял. Вы в AS используете CVAVR в кач-ве тулчейна. Я даже не знал, что оно CVAVR как тулчейн может использовать.

Не понял про что Вы :shock: Я сделал примитивно. Написал в CVAVR, скомпилилось. Затем тупо Ctrl+C, Ctrl+V в среде AS7. Ну и подправил там инклуды, заголовки функций для обработки прерываний,...
Могу ещё IAR-овский исходник скинуть и AStudio, чтоб полная картина была...

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 20:17:32

В последнем приложенном вами файле с проектом AS там явно код чисто CVAVR и в настройках тулчейн стоит CVAVR.
Если делали под avr-gcc - дайте код в этом варианте, у вас же там проблема. Может что при портировании забыли. Помимо флэша/PROGMEM, там еще доступ к EEPROM, к примеру разный (ну это к слову).
Кстати, в avr-gcc, помимо PROGMEM, хранение переменных во флэше давно реализовано более удобно, через named address spaces: https://gcc.gnu.org/onlinedocs/gcc-6.1. ... paces.html
Почти аналогично CVAVR в общем-то.

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 20:35:10

К примеру здесь

Так это Вы про то, как размещать во флеше константы. А я подумал, что Вы как-то из приведенной ранее прошивки (которая во флеш пишется) и .elf файла исходник восстановили :))
Всё равно спасибо! Я уже так делал - размещал константы во флеш, когда часики на ИВ-4 делал, чтоб буквы там отображались, цифры. Работает.
NStorm писал(а):В последнем приложенном вами файле с проектом AS там явно код чисто CVAVR и в настройках тулчейн стоит CVAVR.

Эммм... Я ж говорю, просто текст из CVAVR скопипастил в AS. Ну и косметика навёл.
Привожу все три варианта проектов. IAR у меня 7.20.1, а проекты AS - начинал в AS6.2, да поставил AS7, она и конвертнула в свой формат.
Вложения
LightRegulator.zip
(503.95 KiB) Скачиваний: 253

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 21:04:36

Electro_Alex писал(а):Я ж говорю, просто текст из CVAVR скопипастил в AS.
Еще раз
Dimon456 писал(а):Строка temp = MaxValueSquare[_LightLevel-1] (читаем из флеш памяти) справедлива для CVAVR, но не для AS7.

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 21:40:50

Строка temp = MaxValueSquare[_LightLevel-1] (читаем из флеш памяти) справедлива для CVAVR, но не для AS7.

Кажется я Вас понял! :) В AS7 следует писать
Код:
temp = pgm_read_word(&MaxValueSquare[_LightLevel-1]);
Или не прав я?

Добавлено after 3 minutes 32 seconds:
Блииин! :o А ведь правда! Глянул исходник проекта часиков... присваивал там я через pgm_read_byte(&segm_a[i]). Вот жешь :facepalm:
Завтра на работе попробую.

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 22:04:13

Эммм... Я ж говорю, просто текст из CVAVR скопипастил в AS. Ну и косметика навёл.
Привожу все три варианта проектов. IAR у меня 7.20.1, а проекты AS - начинал в AS6.2, да поставил AS7, она и конвертнула в свой формат.

Вот сейчас вижу:
<ToolchainName>com.Atmel.AVRGCC8.C</ToolchainName>
А прошлый проект, что вы выкладывали, он тоже в AS был сделан. Только тулчейном (компилятор+линковщик и т.д.) там стоял CVAVR. Т.е. код редактировать можно было в студии, но компилировался он с помощью CVAVR.

И я вам ссылочку давал. Чтобы не писать pgm_read... каждый раз, можно в объявлении массивов вместо PROGMEM написать __flash.
const __flash unsigned char LimitValueLog_6[] = { ... };

Re: Проблема с fast-ШИМ в AtmelStudio7

Вт ноя 19, 2019 22:24:05

Я знал про возможность писать код в AS, а компилился чтобы в CVAVR. Пробовал так в 6.2 - при создании нового проекта, студия спрашивала про тип проекта: GCC C Executable Project, GCC C Static Library Progect, ... , CVAVR Project. Попробовал CVAVR тулчейн - при компиляции CVAVR спросил лицензионный ключик :))) Оказалось кряк для CVAVR с графической частью, а кряка для CVAVR с командной строкой (а как раз его и вызывает AS) нету. Да и забил.
AS7 уже не предлагает CVAVR тулчейн, вместо него ардуина.
Ответить