Я думаю так: МК ждет на вохде 0 или 1 порта А высокий уровень ( сигнал), и если дождалась - выполняет код. На входы и буду подавать положительное напряжение ИП, подтягивающие резиторы надо значит не ставить.
Почему компилятор выдает ошибку в этой строке?
while (PINA.0=1 || PINA.1=1); // если на входе...
Не умеешь - не берись, но не взявшись не научишься...
Но ведь Символ = обозначает присваивание!
Мы же ведь присваиваем выходу 0 или 1 порта А значение логической 1. И ставим перед ними while - это как если........
Почему мы приравниваем выходу порта А логическую 1?
Что то я в этом запутался немножко...
Не умеешь - не берись, но не взявшись не научишься...
Stalker46 писал(а):Но ведь Символ = обозначает присваивание!
Мы же ведь присваиваем выходу 0 или 1 порта А значение логической 1. И ставим перед ними while - это как если........
Почему мы приравниваем выходу порта А логическую 1?
Что то я в этом запутался немножко...
я вам расскажу, как быть должно, а уж что там ваш любимый CVAVR делает на самом деле - я не знаю. сами разбирайтесь.
если мы пишем if(var1 = var2), то компилятор поступает так: сначала переменная var1 получает значение переменной var2, а потом содержимое var1 проверяется на равенство нулю. т.е. это эквивалентно следующему: var1 = var2;
if(var1)...
то есть в качестве значения выражения, состоящего из оператора присваивания, принимается значение переменной, получающей значение (т.е. значение левой части выражения).
если вы хотели занести в пину единички, то ваш while становися бесконечным: while(1 || 1) - не так ли? возможно, об этом вам компилятор и сообщает.
возможно, ему не понравилось такое совмещение присваивания с проверкой условия, т.к. он (компилятор ваш) шибко грамотный и использует точечную нотацию для манипуляций над битами (фича, отсутствующая в стандарте Си), при этом он генерирует асмовую инструкцию SBI или CBI. в то же время для проверки бита он использует инструкцию SBIS или SBIC - возможно в случае, когда присваивание совмещено с проверкой, он не понимает, что ему делать... короче, гадальщик из меня плохой... к тому же вы не потрудились привести матюк компилятора, что хоть как-то пролило бы свет на проблему...
на вашем месте я бы написал максимально просто все, не стремясь "одновременно" сделать несколько дел. во всяком случае, это помогло бы вам понять, что именно вы делаете...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):компилятор ваш шибко грамотный и использует точечную нотацию для манипуляций над битами (фича, отсутствующая в стандарте Си), ... возможно в случае, когда присваивание совмещено с проверкой, он не понимает, что ему делать...
Именно - старая история с приоритетами операций и порядком исполнения - если присвоения выделить скобками, то все становится на свои места, так как после этого передается правильный порядок выполнения - сначала осуществить два присвоения, а затем уже привести значения обоих выражений и сложить по ИЛИ. Без этого выделения он пытается выполнить такие присвоения:
а) PINA.1 = 1
б) 1 || PINA.1 = <значение из а)> - ну, и кому здесь присваивать?
в) PINA.0 = <значение из б)>
См. скриншот - там внизу видна ругань компилятора (must be lvalue), а на одну строку выше (откомментарено) находится то же выражение, но с нужными скобками - ругань исчезает.
А вообще - он правильно намекает на "possibly incorrect assignment".
Лучший способ запутать компилятор - запутаться самому! Пусть-ка он попробует понять то, что и программист не понимает... А лучший способ запутаться самому - в полный рост использовать умолчания, о которых ничего не помнишь - каково старшинство операций, в каком поорядке они исполняются и т.д.
Скобки придумали слабые духом!
Сталкер46 - учись правильно писать бесконечные циклы!
У меня бесконечные циклы всегда компилировались без ошибок, а потом я сидел и ждаааал.... и думал - "а что это ничего не мигает?"
Последний раз редактировалось Yellow Tiger Чт мар 26, 2009 16:11:49, всего редактировалось 1 раз.
Stalker46 писал(а):бесконечный щикл это и есть while...
Бесконечный цикл - это не do не while и не for - это цикл без условия выхода.
Stalker46 писал(а):что то в голове крутится а дойти не может...
Выдели скобками, как показано и запусти - все скомпилируется, но проц навсегда завсинет внутри этого цикла.
А заменишь "=" на "==" и все заработает. Вот над этой разницей в поведении и подумаешь, и все прояснится.
ARV писал(а):а разве приоритет = не однозначно выше приоритета ||?
Вот именно потому и не работает, что он использует правильные приоритеты - то есть, сначала пытается построить цепочку присвоений, а до || даже не доходит, так как встречает непонятку - кому присваивать-то?
P.S. О! Пост № 4.12
Последний раз редактировалось Yellow Tiger Чт мар 26, 2009 16:26:39, всего редактировалось 1 раз.
Yellow Tiger писал(а):Вот именно потому и не работает, что он использует правильные приоритеты - то есть, сначала пытается построить цепочку присвоений, а до || даже не доходит, так как встречает непонятку - кому присваивать-то?
точно... слева от знака равенства должно быть леводопустимое выражение, грубо говоря - переменная, а не выражение... с первым знаком равенства вроде понятно, а второе равенство - уже слева имеет не то, что можно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
а что с этой прогой?
Скомпилировалась отлично, но в протеусе не пашет!
Поставил 0 выход порта Д на Единичку.
Вход сделал порт А, с подтягивающим резистором.
#include <mega16>
#include <delay>
void main(void)
{
while (1)
{
while (!PINA.0==0); // пока на входе 0 порта А не ноль, будет выполняться следующаю программа, а значит при единице
{
PORTD.0=1; // зажигаем 1 светодиод
delay_ms(100); // ждем
PORTD.0=0; // гасим
delay_ms(100); // ждем
}
};
}
Не умеешь - не берись, но не взявшись не научишься...
ARV писал(а): вы хотите, чтобы я стал разглагольствовать о выражении, результатом которого является указатель? думаю, тут и я запросто ошибусь, да и мало кто поймет из остальных... потому и грубо....
Нет. просто я формулирую грубо так: "Переменная должна быть левее присваивания"
потому что с лева может быть например + или & и много всего
переменная +=
переменная &=
Т.е. переменная не слева от присваивания а левее.
Такое определение - "левее" - включает и случаи когда переменная вплотную к присваиванию написана:
вот когда на Си программу пишем, сначала пишем текст, затем смотрим, какие операторы применяли, например, delay_..., и пишем библиотеки - #include <delay> ?
Не умеешь - не берись, но не взявшись не научишься...
Мне когда-то один умный человек советовал записывать условия типа if (a == 5) в виде if (5 == a). Чувствуете разницу? Если в первом случае ошибиться и написать if (a = 5) компилятор это замечательно проглотит, но работать ничего не будет, как мы только что видели выше, а вот если по ошибке написать if (5 = a) - будет ошибка компиляции.