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

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 18
Зарегистрирован: Вт июл 15, 2014 13:45:41

Сообщение Electro_Alex »

Здравствуйте! Я начинающий осваивать 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 - в Протеусе не работает должным образом.
Реклама
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Вы используете режим 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;
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

[uquote="Electro_Alex",url="/forum/viewtopic.php?p=3739233#p3739233"]Что я делаю на так? Что я недопонимаю в работе контроллера/студии?[/uquote]
Не читаете ДШ ) Хоть вам уже и ответили, выдержку с ДШ приведу:
Изображение
Вложения
ocr0x.png
(7.38 КБ) 674 скачивания
Родился
Сообщения: 18
Зарегистрирован: Вт июл 15, 2014 13:45:41

Сообщение Electro_Alex »

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

Сообщение NStorm »

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

Кстати,
В компиляторе отключена оптимизация (-O0)
Для отладки лучше включать -Og.

Ну и давайте .elf прикрепляйте, можно будет глянуть что не работает.
Реклама
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

[uquote="Electro_Alex",url="/forum/viewtopic.php?p=3739487#p3739487"]...Значит, чтобы оперативно изменить значение регистров, мне надо остановить счетчик, изменить регистры и запустить счетчик...[/uquote]Нет.Смысл буферирования в том, что можно асинхронно менять значения регистров, а выполнение сравнения будет только после завершения предыдущего цикла.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15599
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Читаем ограничения в разделе симулятора IDE.
Не знаю, как в 7-ке, а в 4.19 тех ограничений было предостаточно.
8)
Родился
Сообщения: 18
Зарегистрирован: Вт июл 15, 2014 13:45:41

Сообщение Electro_Alex »

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

Сообщение Dimon456 »

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

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

Строка temp = MaxValueSquare[_LightLevel-1] (читаем из флеш памяти) справедлива для CVAVR, но не для AS7.
Родился
Сообщения: 18
Зарегистрирован: Вт июл 15, 2014 13:45:41

Сообщение Electro_Alex »

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:
[uquote="BOB51",url="/forum/viewtopic.php?p=3739555#p3739555"]Читаем ограничения в разделе симулятора IDE.
Не знаю, как в 7-ке, а в 4.19 тех ограничений было предостаточно.
8)[/uquote]
Подскажите где посмотреть, ну чтобы на русском желательно :)
Вложения
CVAVR.zip
Проект в CVAVR.
(89.89 КБ) 225 скачиваний
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

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

EDIT: Без модификаций странно как он вообще собирается у вас.
Да и не могло собраться ведь. Вот хотя бы из-за этого:

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

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
Прерывания не так в avr-gcc прописываются.[/s]
Последний раз редактировалось NStorm Вт ноя 19, 2019 20:03:18, всего редактировалось 2 раза.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Electro_Alex писал(а):Подскажите где посмотреть, ну чтобы на русском желательно
К примеру здесь
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

А, понял. Вы в 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>
...
Родился
Сообщения: 18
Зарегистрирован: Вт июл 15, 2014 13:45:41

Сообщение Electro_Alex »

[uquote="NStorm",url="/forum/viewtopic.php?p=3739809#p3739809"]CVAVR, GCC, IAR - у всех свои нюансы. Проект без модификации не переносится. Разные библиотеки, разные заголовки, разные подходы.[/uquote]
:)) Ну естественно не абсолютно одинаковы они. Изменены были #include и пути к библиотекам, функции обработки прерываний по-другому названы, всякие sei написаны как требуется в среде и т.п. Поэтому и собралось :) Просто вся, скажем так сишная логика не менялась.
Dimon456 писал(а):
Electro_Alex писал(а):Подскажите где посмотреть, ну чтобы на русском желательно
К примеру здесь
Благодарю! Ознакомлюсь.

Добавлено after 4 minutes 24 seconds:
[uquote="NStorm",url="/forum/viewtopic.php?p=3739814#p3739814"]А, понял. Вы в AS используете CVAVR в кач-ве тулчейна. Я даже не знал, что оно CVAVR как тулчейн может использовать.[/uquote]
Не понял про что Вы :shock: Я сделал примитивно. Написал в CVAVR, скомпилилось. Затем тупо Ctrl+C, Ctrl+V в среде AS7. Ну и подправил там инклуды, заголовки функций для обработки прерываний,...
Могу ещё IAR-овский исходник скинуть и AStudio, чтоб полная картина была...
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

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

Сообщение Electro_Alex »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3739811#p3739811"]К примеру здесь[/uquote]
Так это Вы про то, как размещать во флеше константы. А я подумал, что Вы как-то из приведенной ранее прошивки (которая во флеш пишется) и .elf файла исходник восстановили :))
Всё равно спасибо! Я уже так делал - размещал константы во флеш, когда часики на ИВ-4 делал, чтоб буквы там отображались, цифры. Работает.
NStorm писал(а):В последнем приложенном вами файле с проектом AS там явно код чисто CVAVR и в настройках тулчейн стоит CVAVR.
Эммм... Я ж говорю, просто текст из CVAVR скопипастил в AS. Ну и косметика навёл.
Привожу все три варианта проектов. IAR у меня 7.20.1, а проекты AS - начинал в AS6.2, да поставил AS7, она и конвертнула в свой формат.
Вложения
LightRegulator.zip
(503.95 КБ) 265 скачиваний
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

Сообщение Electro_Alex »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3739865#p3739865"]Строка temp = MaxValueSquare[_LightLevel-1] (читаем из флеш памяти) справедлива для CVAVR, но не для AS7.[/uquote]
Кажется я Вас понял! :) В AS7 следует писать

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

temp = pgm_read_word(&MaxValueSquare[_LightLevel-1]);
Или не прав я?

Добавлено after 3 minutes 32 seconds:
Блииин! :o А ведь правда! Глянул исходник проекта часиков... присваивал там я через pgm_read_byte(&segm_a). Вот жешь :facepalm:
Завтра на работе попробую.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

[uquote="Electro_Alex",url="/forum/viewtopic.php?p=3739844#p3739844"]Эммм... Я ж говорю, просто текст из CVAVR скопипастил в AS. Ну и косметика навёл.
Привожу все три варианта проектов. IAR у меня 7.20.1, а проекты AS - начинал в AS6.2, да поставил AS7, она и конвертнула в свой формат.[/uquote]
Вот сейчас вижу:
<ToolchainName>com.Atmel.AVRGCC8.C</ToolchainName>
А прошлый проект, что вы выкладывали, он тоже в AS был сделан. Только тулчейном (компилятор+линковщик и т.д.) там стоял CVAVR. Т.е. код редактировать можно было в студии, но компилировался он с помощью CVAVR.

И я вам ссылочку давал. Чтобы не писать pgm_read... каждый раз, можно в объявлении массивов вместо PROGMEM написать __flash.
const __flash unsigned char LimitValueLog_6[] = { ... };
Родился
Сообщения: 18
Зарегистрирован: Вт июл 15, 2014 13:45:41

Сообщение Electro_Alex »

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

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