реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Вопрос по WinAVR
skyled
сообщение Sep 21 2010, 09:29
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



а если выполнить присвоение перед выполнением функции? поменять опции оптимизатора?
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 21 2010, 11:27
Сообщение #17


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(the_last_dreamer @ Sep 20 2010, 23:21) *
Такой код работает правильно:

Правильно работают оба кода.
В чём смысл представленной программы при наружном наблюдении за её поведением? Крутиться в бесконечном цикле.
При этом внутренние детали поведения, никак не проявляющиеся снаружи, компилятор имеет право выоптимизировать начисто. Во втором случае он всего лишь поленился это сделать.
Объявите tmpVar как volatile, сказав тем компилятору, что он не имеет права предполагать что-то по поводу видимости этой переменной из внешнего по отношению к программе мира, и наслаждайтесь.

Или присвойте значение этой переменной какому-то порту микроконтроллера - нужно дать понять компилятору, что результат floor() кому-то нужен. Хотя и в этом случае он имеет право пробросить результат floor() прямо в порт, исключив из программы переменную tmpVar как не имеющую значения со стороны внешнего наблюдателя.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
the_last_dreamer
сообщение Sep 21 2010, 20:40
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 20-09-10
Из: Киев
Пользователь №: 59 612



>ну дык посмотрите ассемблерные листинги.
К сожалению, ассемблер не знаю, хотя разобраться в нем и надо бы.

>а если выполнить присвоение перед выполнением функции? поменять опции оптимизатора?
компилировал при уровне оптимизации 0. Не помогло sad.gif

>Объявите tmpVar как volatile, сказав тем компилятору, что он не имеет права предполагать что-то по поводу видимости этой переменной из внешнего по отношению к программе мира, и наслаждайтесь.

Большое спасибо за совет. Работает 08.gif

Сообщение отредактировал the_last_dreamer - Sep 21 2010, 20:41
Go to the top of the page
 
+Quote Post
the_last_dreamer
сообщение Sep 22 2010, 20:30
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 20-09-10
Из: Киев
Пользователь №: 59 612



Извините за беспокойство, но она все-таки не работает sad.gif Приведу более толковый текст программы:
CODE
#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>

/******************************************************************
Здесь еще есть обработчики прерываний при переполнении таймеров,
дополнительные процедуры и т.д. и т.п. Их текст не привожу, чтобы не
усложнять чтение программы.
******************************************************************/

volatile unsigned int OCR1AMaxValue=9900;
volatile unsigned char ADCresult=255;

ISR(ADC_vect)
{
//Запись в переменную ADCresult значения АЦ преобразования
ADCresult=ADCH;
//Запись в регистр OCR1A целого выражения
OCR1A=floor(ADCresult/255*OCR1AMaxValue); //Ошибка в этой строке, как мне кажется
//Начать новое преобразование
ADCSRA|=(1<<ADSC);
}

int main (void)
{
SREG=1<<7;
//Установка вывода OC1A при совпадении значений регистров OCR1A и TCNT1
TCCR1A|=(1<<COM1A1)|(1<<COM1A0);
//Включение АЦП. Разрешение прерываний от АЦП.
//Предделитель частоты - 32
ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0);
//Выбор опорного напряжения. Выбор аналогового входа
ADMUX|=(1<<REFS0)|(1<<MUX0);
//Левостороннее выравнивание
ADMUX|=(1<<ADLAR);
//Начать первое преобразование
ADCSRA|=(1<<ADSC);

while (1)
{
//Без этой строки похоже тоже не обойтись. Компилятор выбрасывает пустой цикл из программы
char i=1;
}
return (0);
}


МК выполняет аналогово-цифровое преобразование. В регистр OCR1A необходимо записать целое число значение которого вычисляется по формуле: floor(OCR1AMaxValue*ADCResult/255).

При отладке в Avr Studio происходит следующее (может все слишком подробно описано, но я уже начинаю думать, что я что-то не так делаю в отладчике):
1. В функции main установка битов в регистрах АЦП проходит правильно.
2. После того как программа входит в бесконечный цикл ввожу в регистр ADCH произвольное значение. Например, 64.
3. Устанавливаю breakpoint при входе в обработчик прерываний от АЦП.
4. Нажимаю F5.
5. Программа входит в тело процедуры ISR(ADC_vect).
6. Нажимаю F11.
7. Программа присваивает переменной ADCresult значение 64.
8. Нажимаю F11, когда курсор находится в строке OCR1A=floor(ADCresult/255*OCR1AMaxValue).
9. И в этот момент курсор перескакивает в бесконечный цикл, на строку char i=1. В окне watch значения переменной ADCresult=Not In Scope.
10. Нажимаю F11. Курсор возвращается в обработчик прерывания в строк ADCSRA|=(1<<ADSC). В окне watch ADCresult=64. Но в OCR1A все нули, хотя должно быть 64/255*9900=2484.
11. Далее выполнение программы идет нормально - ожидаем новое прерывание от АЦП. При его возникновении история повторяется.

Компилировал при OPT = 0. Если я правильно понимаю, то компилятор вообще ничего не должен оптимизировать? Может быть я не понял что-то в предыдущих ответах... WinAVR у меня 20090313. Может быть в нем причина? Может ли данная ситуация быть просто глюком AVRStudio, а в реальном устройстве работать правильно?

Подскажите, пожалуйста, в чем ошибка.

Сообщение отредактировал the_last_dreamer - Sep 22 2010, 20:33
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 22 2010, 22:04
Сообщение #20


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(the_last_dreamer @ Sep 22 2010, 23:30) *
Но в OCR1A все нули, хотя должно быть 64/255*9900=2484.
Нет, должно быть 0. Ибо деление в целых числах N/255 даст 0 для любого N меньше 255. Ваша ошибка в том, что вы не учитываете эффектов округления и не знаете правил неявного приведения типов. Совершенно не нужно в прерывании использовать функции, работающие с плавающей точкой. Вообще плавающая точка здесь совершенно не нужна. напишите OCR1A = (unsigned long)ADCresult * OCR1AMaxValue / 255;

Цитата(the_last_dreamer @ Sep 22 2010, 23:30) *
WinAVR у меня 20090313. Может быть в нем причина? Может ли данная ситуация быть просто глюком AVRStudio
Агащазблин. Есть хорошая поговорка про зеркало...


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
the_last_dreamer
сообщение Sep 23 2010, 19:31
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 20-09-10
Из: Киев
Пользователь №: 59 612



Спасибо, Сергей Борщ! В регистр теперь записывается то число что нужно.
Go to the top of the page
 
+Quote Post
the_last_dreamer
сообщение Oct 9 2010, 13:14
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 20-09-10
Из: Киев
Пользователь №: 59 612



Возникла ещё такая проблема. Хотелось бы отладить программу в Proteus. Прочитал, что для того чтобы можно было отлаживать программу пошагово и при этом видеть текст программы нужно в МК загрузить файл .cof или .elf, а не .hex. Создаю файл .cof с помощью команды make extcoff. Загружаю его в МК, после запуска в окне AVR Source Code - U1 текст программы не отображается. Но есть надпись No source line at PC adress. При загрузке .cof файла, созданного в codevisionavr, код программы отображается. Можно перейти на CVAVR, но все-таки хотелось бы разобраться в WinAVR smile.gif
Go to the top of the page
 
+Quote Post
the_last_dreamer
сообщение Oct 9 2010, 14:22
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 20-09-10
Из: Киев
Пользователь №: 59 612



Кажется проблема разрешилась - поместил в одну папку файл .elf программы и файл проекта Proteus'а smile.gif
Go to the top of the page
 
+Quote Post
Smoky
сообщение Jan 22 2011, 15:27
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135



Добрый день. По понятным, я думаю, причинам пришлось перейти с CVAVR на WINAWR. Скачал последнюю версию 20100110 и с первой же попытке компиляции простой программки сел в "галошу". Во первых в этой версии нет ни одного примера, пришлось использовать старые источники информации. С первой же попытки было сообщение о том что не верно указан адрес библиотеки <avr/delay.h>, а также об ошибочном макроопределении _delay_loop_2(). Насколько я понял, это макроопределение уже не используется. Уважаемые коллеги, пделитесь пожалуйста примерами по этой системе, и подскажите в каких разделах прилагаемой документации можно найти примеры применения самых ходовых макроопределений. Спасибо.


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 22 2011, 19:31
Сообщение #25


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



WinAWR-20100110/doc/avr-libc/avr-libc-user-manual.pdf
Примеры тоже есть.
WinAWR-20100110/doc/avr-libc/examples/stdiodemo - тут используется <util/delay.h>

Если макросы _delay_ms()/_delay_us() не используются, то можно обойтись <util/delay_basic.h> (его услугами и пользуется <util/delay.h>) в котором живут _delay_loop_1() и _delay_loop_2() (страница 297 из указанной pdf-ки из комплекта WinAVR-20100110)





--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Smoky
сообщение Jan 23 2011, 07:27
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135



Цитата(ReAl @ Jan 23 2011, 00:31) *
WinAWR-20100110/doc/avr-libc/avr-libc-user-manual.pdf
Примеры тоже есть.
WinAWR-20100110/doc/avr-libc/examples/stdiodemo - тут используется <util/delay.h>


Очень вам благодарен, спасибо!


--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st July 2025 - 11:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.0146 секунд с 7
ELECTRONIX ©2004-2016