Начинаю работать с AVR

Получил долгожданную PinBoard2! Начинаю работать с AVR, а там и до ARM дело дойдет…
После традиционной демо-прошивки подключил RGB-светодиод, перекомпилировав прошивку, предназаначавшуюся для ATMega8.
При этом обнаружился странный глюк.

У меня стоит Студия4 и Студия5, сначала попробовал в Студии4, потому что проект был для нее, перекомпилировал, прошил, не работает. Первой ошибкой было, что в Меге16 ШИМ на другом порту. Ладно, разобрались, перекомпилировал, перешил, светодиод зажегся равномерно всеми цветами на половину яркости.
После 15 минут тупления в код из ровно 12 строчек, запустил отладку в симуляторе и заметил, что в процедуру pause я не попадаю.?
Убрал процедуру, засунул цикл for прямо в main в трех местах… То же самое. Еще минут пять искал пропущенные точки с запятыми, помня что компилятор C для пика выдавал что-то подобное при отсутствии некоторых скобок и т.п.
В итоге в Студии5 создал новый проект, вставил туда весь код, тупо скопипастив, откомпилировал, прошил, и все заработало.
Что это было?

Комментарии (13)

RSS свернуть / развернуть
Пример кода в студию! Как реализована задержка? Пустым циклом? Может оптимизатор ее просто выкидывает из кода?
0
void main(void)
{ unsigned char i;
 unsigned int j;
 init_pwm();

 while (1)
  { 
    for (i=0;i<255;i++)
	 {
	  R_channel--;
	  G_channel++;
	 	for (j=RGB_pause;j>0;j--);
	 }

    for (i=0;i<255;i++)
	 {
	  G_channel--;
	  B_channel++;
	 	for (j=RGB_pause;j>0;j--);
     }

    for (i=0;i<255;i++)
	 {
	  B_channel--;
	  R_channel++;
0
for (j=RGB_pause;j>0;j--);
     } 

  }
}

0
Кусочек чуть не потерялся…
Я до оптимизатора не добрался, хотя тоже о нем подумал, это просто был экспромт такой, чего-бы такого быстренько подсоединить…
0
Оптимизатор такие циклы выкидывает. В студио5 у тебя скорее всего просто включена дефолтная дебаг-конфигурация с отключенным оптимизатором.
Используй задержки из avr-libc (_delay_ms и иже с ней из util/delay.h).
0
У меня тут проект на подходе один, так там конечно будет все по уму сделано, на прерываниях и таймере, а это было так, просто так.
Ну и потом, я еще даже со средой программирования не разобрался нормально.
Спасибо.
0
если 5 студия вкатила, можешь смело 6 ставить
0
Да, скорей всего оптимизатор в таком случае. С меня такой программист, как… в общем не важно, там есть ассемблерная команда, которая ничего не делает, или использовать директиву выключения оптимизации.
Например, для код вижна было бы так:

#pragma optsize-
for (j=RGB_pause;j>0;j--);
     } 

  }
}
#pragma optsize-

Если я ничего не напутал… у Вас могут быть другие директивы.
0
думаю что при декларации RGB_pause
добавить volatile и оптимизация не будет ее выкидывать
0
volatile 100% сработает только при дебаге. при релизе высока вероятность игнора volatile
-1
Если переменная глобальная, то компилятор, который проигнорирует volatile, фтопку.
+1
Всем спасибо за участие, Студия5 помещает все в папку Debug, вероятно оптимизация отключена.
В дальнейшем, думаю, буду на таймер вешать задержку.
Да и, кстати, предыдущий мой проект — контроллер горелки, мой первый блин на Си, до этого писал на асмe для PIC и на Делфи для PC, так что даже не знаю, что такое volatile, хотя и встречал ее в книге.
0
volatile — это переменная, которая может изменяться независимо от генерируемого компилятором кода. По сути, это ключевое слово запрещает оптимизировать операции чтения/записи этой переменной. Т.е. если обычная переменная читается два раза подряд — компилятор прочитает ее в регистр один раз и обе операции выполнит со значением из регистра, а volatile он честно два раза прочитает из ОЗУ. Аналогично если писать в нее несколько раз подряд, не используя записанное значение — у обычной копилятор выкинет все записи, кроме последней, а в volatile запишет все.
К таким «самоизменяющимся» переменным относятся переменные, которые могут изменяться одновременно несколькими потоками исполнения и регистры железа.
Кроме того, иногда ключевое слово volatile применяют, чтобы запретить оптимизатору оптимизировать кусок кода, как например цикл задержки.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.