Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Оптимизация в WinAVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
smk
Вот такой кусок кода:

uint_least8_t k = (T_TEST<<2);
for(;;)
{
//***********************************
if(ac>A_SIG)
{
a_on;
buzz_on;
}

if(ac>B_SIG)
{
b_on;
buzz_on;
}
//***********************************
if( TIFR1 & (1<<TOV1) )
{
TCNT1H = (unsigned char)((T1_DIV)>>8);
TCNT1L = (unsigned char)T1_DIV;
TIFR1 |= (1<<TOV1);
if( !--k )
break;
}
}

То, что между строками из звездочек выбрасывается из программы, а это нельзя. Что можно предпринять? Заранее спасибо!
singlskv
Цитата(smk @ Feb 14 2008, 00:16) *
Вот такой кусок кода:
.......
uint_least8_t k = (T_TEST<<2);
for(;;)
{
//***********************************
if(ac>A_SIG)
{
a_on;
buzz_on;
Вы бы хоть написали что означают:
a_on
buzz_on
ac
A_SIG
B_SIG

А варнингов у Вас не выдает случаем ?
Самое вероятное ,учитывая количество инфы в Вашем посте,
у Вас ac объявленно как unsigned char, а A_SIG и B_SIG это дефайны которые получены
путем каких-то вычислений, и в результате этих вычислений A_SIG и B_SIG просто >256,
поэтому компилятор вправе a_on и buzz_on просто выкинуть.
smk
Цитата
Вы бы хоть написали что означают:


unsigned int ac; //глобальная
A_SIG = EEPROM_read_16 (10, 11); //тоже int читается из EEPROM
B_SIG = EEPROM_read_16 (14, 15);
#define a_on PORTA &= ~(1<<1);
#define b_on PORTA &= ~(1<<0);
#define buzz_on DDRB |= (1<<2);

Вообще-то начальное значение, например, A_SIG это 0xFF, а ac всегда инициализируется как 0. Потом конечно в прерывании от ADC значение ас меняется, пишется в EEPROM, на место, например, A_SIG. При повторном включении все повторяется, только A_SIG уже не 0xFF. Это нужно для калибровки при серии последовательных включений. Как быть?

Варнингов нет.
Спасибо, что откликнулись! Просто ума не приложу с какого конца подступиться...
singlskv
Цитата(smk @ Feb 14 2008, 00:44) *
unsigned int ac; //глобальная
A_SIG = EEPROM_read_16 (10, 11); //тоже int читается из EEPROM
B_SIG = EEPROM_read_16 (14, 15);
#define a_on PORTA &= ~(1<<1);
#define b_on PORTA &= ~(1<<0);
#define buzz_on DDRB |= (1<<2);

макросы написаны не очень, но в принципе криминала никакого нет,
разьве что ; где-нить уберите, или в определении или в подстановке,
хотя это тоже не криминал.
Ну и для макросов строго обязательно все заключать в скобки, те например
#define SHIFT 5
#define MYBIT (1<<SHIFT)
Если убрать скобки в определении MYBIT, будете "долго жевать сопли замоченные в сортире..." © ВВП

А зачем у Вас передается 2 числа в EEPROM_read_16 ?
Адреса ячеек ? 16 бит у Вас может храниться не в соседних ячейках ?

А по Вашей проблеме, ну... проект в студию что ли...
Выкидывать обращения к PORTA компилятор права не имеет...
Если Вы конечно его не переопределили..
smk
Там что-то с условиями if связано. Не могу разобраться пока. А есть возможность сказать "это не трогать"?
smk
Ну вобщем, может кто будет читать с аналогичной проблемой... Компилировать программы, работающие с EEPROM нужно приведя предварительно содержание EEPROM в вид, соответствующий виду при первом включении устройства.

И еще...
Цитата
макросы написаны не очень

стиль не такой и т.п. А как надо? Прерывание тоже переписал, но логически суть не изменилась. Обработчик разьве что стал короче... Так какие "Правила хорошего тона для С"? Хочу научиться им.
SSerge
Цитата(smk @ Feb 14 2008, 03:44) *
Потом конечно в прерывании от ADC значение ас меняется,

а компилятор-то об этом не знает, надо ему объяснить:
volatile unsigned int ac; //глобальная
smk
Цитата
компилятор-то об этом не знает, надо ему объяснить:
volatile unsigned int ac; //глобальная

Сделал. На будущее - так со всеми глобальными поступать?
Сергей Борщ
Цитата(smk @ Feb 14 2008, 09:08) *
Сделал. На будущее - так со всеми глобальными поступать?
С теми, которые изменяются неизвестными компилятору способами. Он видит, что перед циклом вы ac обнулили, а в цикле не изменяете - он и считает, что она осталась равной нулю и значит ваши условия не сработают. Так зачем их проверять?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.