Помощ с программой

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

while (PINA.0=1 || PINA.1=1); // если на входе...
PORTD.0=1; // зажигаем 1 светодиод
delay_ms(100); // ждем
PORTD.0=0; // гасим
delay_ms(100); // ждем
PORTD.1=1; // зажигаем 2 светодиод
delay_ms(100); //ждем
PORTD.1=0; // гасим
delay_ms(100); // ждем

Я думаю так: МК ждет на вохде 0 или 1 порта А высокий уровень ( сигнал), и если дождалась - выполняет код. На входы и буду подавать положительное напряжение ИП, подтягивающие резиторы надо значит не ставить.
Почему компилятор выдает ошибку в этой строке?

while (PINA.0=1 || PINA.1=1); // если на входе...
Не умеешь - не берись, но не взявшись не научишься...
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

потому что вы плохо знаете синтаксис языка Си: знак проверки на равенство ==, а не =, как у вас.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

Но ведь Символ = обозначает присваивание!
Мы же ведь присваиваем выходу 0 или 1 порта А значение логической 1. И ставим перед ними while - это как если........
Почему мы приравниваем выходу порта А логическую 1?

Что то я в этом запутался немножко...
Не умеешь - не берись, но не взявшись не научишься...
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

Вот даже с исправленным видом не работает...
Не умеешь - не берись, но не взявшись не научишься...
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

У Вас условие пока PINA.1 равно лог 1 то делам что то, а не мы присваиваем PINA.1 уровень лог.1. Тесть нужно проверить наше условие:

Код: Выделить всё

while (PINA.0==1 || PINA.1==1); // если на PINA.0 есть лог.1 или на PINA.0 есть лог.1 - зажигаем 1 светодиод
{
PORTD.0=1; // зажигаем 1 светодиод
delay_ms(100); // ждем
PORTD.0=0; // гасим
delay_ms(100); // ждем
PORTD.1=1; // зажигаем 2 светодиод
delay_ms(100); //ждем
PORTD.1=0; // гасим
delay_ms(100); // ждем 
} 
Я не Сашок!!!
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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 - возможно в случае, когда присваивание совмещено с проверкой, он не понимает, что ему делать... короче, гадальщик из меня плохой... к тому же вы не потрудились привести матюк компилятора, что хоть как-то пролило бы свет на проблему...

на вашем месте я бы написал максимально просто все, не стремясь "одновременно" сделать несколько дел. во всяком случае, это помогло бы вам понять, что именно вы делаете...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

Так у нас же PINA.1==1. это же и означает, что на входе 1 порта А логическая единица...
Не умеешь - не берись, но не взявшись не научишься...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

после того, как вы вместо = написали == - да, у вас началась проверка... а я пишу медленно :)

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

Мой уютный бложик... заходите!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

ARV писал(а):компилятор ваш шибко грамотный и использует точечную нотацию для манипуляций над битами (фича, отсутствующая в стандарте Си), ... возможно в случае, когда присваивание совмещено с проверкой, он не понимает, что ему делать...
Именно - старая история с приоритетами операций и порядком исполнения - если присвоения выделить скобками, то все становится на свои места, так как после этого передается правильный порядок выполнения - сначала осуществить два присвоения, а затем уже привести значения обоих выражений и сложить по ИЛИ. Без этого выделения он пытается выполнить такие присвоения:

Код: Выделить всё

а) PINA.1 = 1

б) 1 || PINA.1 = <значение из а)> - ну, и кому здесь присваивать?

в) PINA.0 = <значение из б)>
См. скриншот - там внизу видна ругань компилятора (must be lvalue), а на одну строку выше (откомментарено) находится то же выражение, но с нужными скобками - ругань исчезает.
А вообще - он правильно намекает на "possibly incorrect assignment". ;)

Изображение

Лучший способ запутать компилятор - запутаться самому! Пусть-ка он попробует понять то, что и программист не понимает... А лучший способ запутаться самому - в полный рост использовать умолчания, о которых ничего не помнишь - каково старшинство операций, в каком поорядке они исполняются и т.д.
Скобки придумали слабые духом!

Сталкер46 - учись правильно писать бесконечные циклы! :)))
У меня бесконечные циклы всегда компилировались без ошибок, а потом я сидел и ждаааал.... и думал - "а что это ничего не мигает?" :)))
Последний раз редактировалось Yellow Tiger Чт мар 26, 2009 16:11:49, всего редактировалось 1 раз.
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

бесконечный щикл это и есть while...
что то в голове крутится а дойти не может... :?
Не умеешь - не берись, но не взявшись не научишься...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Yellow Tiger писал(а):Именно - старая история с приоритетами операций и порядком исполнения
а разве приоритет = не однозначно выше приоритета ||? или CVAVR по-своему приоритеты расставляет?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Stalker46 писал(а):бесконечный щикл это и есть while...
Бесконечный цикл - это не do не while и не for - это цикл без условия выхода.
Stalker46 писал(а):что то в голове крутится а дойти не может... :?
Выдели скобками, как показано и запусти - все скомпилируется, но проц навсегда завсинет внутри этого цикла.
А заменишь "=" на "==" и все заработает. Вот над этой разницей в поведении и подумаешь, и все прояснится.
ARV писал(а):а разве приоритет = не однозначно выше приоритета ||?
Вот именно потому и не работает, что он использует правильные приоритеты - то есть, сначала пытается построить цепочку присвоений, а до || даже не доходит, так как встречает непонятку - кому присваивать-то?

P.S. О! Пост № 4.12 :)))
Последний раз редактировалось Yellow Tiger Чт мар 26, 2009 16:26:39, всего редактировалось 1 раз.
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

Файл то у меня скомпилировался да не работает...


Ладно, вот пример, сделал все правильно...



#include <mega16>
#include <delay>



void main(void)
{

while (1)
{
// Place your code here

while (!PINA.0==0); // если не ноль...
{
PORTD.0=1; // включаем
delay_ms(100); // ждем
PORTD.0=0; // вырубаем
delay_ms(100); //ждем
}






};
}


но эта программа не работает в протеусе. Вот еще вопрос. когда выставляешь порты на вывод, там есть 1 или 0 что это обозначает?
Не умеешь - не берись, но не взявшись не научишься...
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Stalker46 писал(а):Файл то у меня скомпилировался да не работает...
А я разве не то же самое тебе писал, вот только-что? 8)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Yellow Tiger писал(а):Вот именно потому и не работает, что он использует правильные приоритеты - то есть, сначала пытается построить цепочку присвоений, а до || даже не доходит, так как встречает непонятку - кому присваивать-то?
точно... слева от знака равенства должно быть леводопустимое выражение, грубо говоря - переменная, а не выражение... с первым знаком равенства вроде понятно, а второе равенство - уже слева имеет не то, что можно :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

ARV писал(а):точно... слева от знака равенства должно быть леводопустимое выражение, ...
Именно! Маст би эль-вэлью! :)))
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

а что с этой прогой?
Скомпилировалась отлично, но в протеусе не пашет!
Поставил 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); // ждем
}















};
}
Не умеешь - не берись, но не взявшись не научишься...
Опытный кот
Аватара пользователя
Сообщения: 828
Зарегистрирован: Пн мар 16, 2009 21:40:57

Сообщение ikarab »

ARV писал(а): вы хотите, чтобы я стал разглагольствовать о выражении, результатом которого является указатель? думаю, тут и я запросто ошибусь, да и мало кто поймет из остальных... потому и грубо....
Нет. просто я формулирую грубо так: "Переменная должна быть левее присваивания"

потому что с лева может быть например + или & и много всего

переменная +=
переменная &=

Т.е. переменная не слева от присваивания а левее.

Такое определение - "левее" - включает и случаи когда переменная вплотную к присваиванию написана:

переменная =

Сне кажется что так понятней и точней.
Контактная информация:
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

вот когда на Си программу пишем, сначала пишем текст, затем смотрим, какие операторы применяли, например, delay_..., и пишем библиотеки - #include <delay> ?
Не умеешь - не берись, но не взявшись не научишься...
Модератор
Аватара пользователя
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург

Сообщение Aheir »

Мне когда-то один умный человек советовал записывать условия типа if (a == 5) в виде if (5 == a). Чувствуете разницу? Если в первом случае ошибиться и написать if (a = 5) компилятор это замечательно проглотит, но работать ничего не будет, как мы только что видели выше, а вот если по ошибке написать if (5 = a) - будет ошибка компиляции.
Оптимизм х (Опыт + Знания) = const
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»