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

 
 
> Вопрос по WinAVR
Jagupop
сообщение May 15 2007, 05:08
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



Сразу оговорюсь - я только учусь!!! Взял книгу Ю.Шпака Программирование на языке C для AVR и PIC микроконтроллеров. В придачу дан диск, на котором WINAVR версии 20040404 и примеры программ. Я некоторые пробовал и проверял на ATTINY2313. Но этот WINAVR не поддерживает такой процессор. Пришлось программы делать для AT90S2313 и прошивать ими тини. Но когда я поставил на комп. поддерживающий тини WINAVR 20060421, у меня перестали компилироваться программы, работавшие со старой версией WINAVR. Не знаю, что и делать. Уж не возвращаться же к старой версии! Подвкажите, спецы! Спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
the_last_dreamer
сообщение Sep 22 2010, 20:30
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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

Сообщений в этой теме
- Jagupop   Вопрос по WinAVR   May 15 2007, 05:08
- - haker_fox   Цитата(Jagupop @ May 15 2007, 14:08) Сраз...   May 15 2007, 05:18
- - Jagupop   Ну вот простая программка мигания светодиодом по п...   May 15 2007, 05:29
|- - haker_fox   Слегка изменил, компиляция проходит нормально. В В...   May 15 2007, 05:51
- - big256   В новом ВинАвре используется ISR вместо INTERRUPT ...   May 15 2007, 05:42
- - Jagupop   Спасибо. Сажусь "ковыряться" дальше. Ещ...   May 15 2007, 07:14
|- - manul78   Цитата(Jagupop @ May 15 2007, 15:14) Спас...   May 15 2007, 15:57
||- - hd44780   Привет всем. Использую WinAVR 20070122. Проект ис...   May 16 2007, 03:38
||- - aesok   В С файле есть строка #include <avr/interrupt.h...   May 16 2007, 04:46
||- - hd44780   Цитата(aesok @ May 16 2007, 10:46) В С фа...   May 16 2007, 05:51
|- - Сергей Борщ   Цитата(Jagupop @ May 15 2007, 14:14) В ка...   May 16 2007, 03:35
- - hd44780   Работает нормально. Проблемы с раскодировкой сигн...   May 16 2007, 10:38
- - mdmitry   >Использую WinAVR 20070122. >SIGNAL ( SIG_IN...   May 16 2007, 17:13
- - the_last_dreamer   Доброго времени суток! Имеется такой простеньк...   Sep 20 2010, 20:21
|- - ReAl   Цитата(the_last_dreamer @ Sep 20 2010, 23...   Sep 21 2010, 11:27
- - WHALE   ну дык посмотрите ассемблерные листинги.   Sep 21 2010, 07:26
- - skyled   а если выполнить присвоение перед выполнением функ...   Sep 21 2010, 09:29
- - the_last_dreamer   >ну дык посмотрите ассемблерные листинги. К сож...   Sep 21 2010, 20:40
- - the_last_dreamer   Спасибо, Сергей Борщ! В регистр теперь записыв...   Sep 23 2010, 19:31
- - the_last_dreamer   Возникла ещё такая проблема. Хотелось бы отладить ...   Oct 9 2010, 13:14
- - the_last_dreamer   Кажется проблема разрешилась - поместил в одну пап...   Oct 9 2010, 14:22
- - дымок   Добрый день. По понятным, я думаю, причинам пришло...   Jan 22 2011, 15:27
- - ReAl   WinAWR-20100110/doc/avr-libc/avr-libc-user-manual....   Jan 22 2011, 19:31
- - дымок   Цитата(ReAl @ Jan 23 2011, 00:31) WinAWR-...   Jan 23 2011, 07:27


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

 


RSS Текстовая версия Сейчас: 12th August 2025 - 00:17
Рейтинг@Mail.ru


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