Форум myROBOT.ru » Шаг за шагом » С чего начать? » программирование

Страниц (6): « 1 2 3 [4] 5 6 »
 

46. Predator - 01 Февраля, 2019 - 18:06:01 - перейти к сообщению
Опыт приходит сразу после того, как был нужен.
Цитата:
потратил ваше время задавая глупые вопросы

да не жалко, на пользу-же пошло.
Повторюсь - если 2004 в вашем нике - год рождения, то большинство вопросов очень закономерные (вы просто не могли этого знать). Я например с 2002 года в контроллерах, и с 1992 года в электронике.
47. Andrey 2004 - 07 Февраля, 2019 - 20:19:05 - перейти к сообщению
Да 2004 это год моего рождения, пытаюсь пробовать себя в программирование.
Есть программа которую мне нужно написать, но она достаточно серьезная, за день не напишешь, тем более с моими знаниями... Вообщем буду потихоньку изучать микроконтроллеры.
Сегодня скачали АВР студио 7, попробовал снова скомпилировать данную программу:

CODE:
#define F_CPU 1000000UL
#include <util/delay.h>
#include <avr/io.h>
#define LED PORTC//переименовывание порта ц
#define k PORTD//переименовывание порта д
#define D 300// задержка

int main(void)
{ DDRD=0b00000000;//таким образом мы настраиваем порт D на вход
DDRC=0b11111111;//так мы настраиваем порт C на выход
LED=0b00000000;// LED то же самое что и PORTC который при запуске программы гореть не должен
k= 0b11111111;// таким образом мы к кнопкам подключили подтягивающий резистор.

while(1)

if (PIND= 0b11111110)//т е если на кнопке 1 низкое состояние то значит кнопка нажата.
{ LED=0b01010101;
_delay_ms(D);
LED=0b10101010;
_delay_ms(D); }
else
{
LED=0b00000000;// если бы тут было что либо другое то пока мы бы не нажали кнопку выполнялась бы эта функция.
}

if (PIND=0b11111101)
{LED=0b11111111;
_delay_ms(D);
LED=0b00000000;
_delay_ms(D);
}
else
{
LED=0b00000000;
}


}


В итоге выдало вот эти два ворнинга:

Warning suggest parentheses around assignment used as truth value [-Wparentheses]
при двойном щелчке кидает на эту строку:

CODE:
if (PIND= 0b11111110)//т е если на кнопке 1 низкое состояние то значит кнопка нажата.


второй такой же, только кидает на эту строку:

CODE:
if (PIND=0b11111101)


ну а все те ошибки которые были в прошлой АВРке ушли.
48. Predator - 07 Февраля, 2019 - 21:07:16 - перейти к сообщению
сравнение ==
49. Andrey 2004 - 07 Февраля, 2019 - 21:34:35 - перейти к сообщению
ДА, все варнинги ушли, спасибо.
50. Predator - 08 Февраля, 2019 - 10:52:09 - перейти к сообщению
немного поясню:
== сравнение, a==b в случае, если a и b равны - возвращает 1, если не равны, возвращает 0.
= присвоение a=b - значит, в ячейку a прописать значение ячейки b, в случае удачной записи возвращает единицу. В варнинге и ругалось, что всегда единица будет.
51. Andrey 2004 - 08 Февраля, 2019 - 19:42:51 - перейти к сообщению
Подскажите пожалуйста где можно изучить теорию программирования на C++ (электронные книги, сайты).
52. Predator - 08 Февраля, 2019 - 20:47:19 - перейти к сообщению
классика:
http://e-maxx.ru/bookz/files/golub_cord.pdf
http://8361.ru/6sem/books/Straustrup-Yazyk_programmirovaniya_c.pdf

но моё мнение таково: если собираешься всю жизнь писать на одном языке и под одной оболочкой - досконально изучай документацию к оболочке и компилятору.
для моей жизни и работы вполне хватает знания основ и, главное, чёткого понимания что я хочу напрограммировать.
Когда возникают проблемы (в моём случае со знаками ^&*~ при применении указателей) просто гуглю. Когда нужно накодить что-то нестандартное - читаю документацию на компилятор.
В общем чем читать книги - лучше много программировать мелких задач, а для работы с контроллерами гораздо полезнее изучить документацию на контроллер.
53. Andrey 2004 - 10 Февраля, 2019 - 15:36:22 - перейти к сообщению
Спасибо за книги, в будующем думаю много интересного из них подчеркну.
Predator пишет:
если собираешься всю жизнь писать на одном языке и под одной оболочкой - досконально изучай документацию к оболочке и компилятору.

Не знаю, пока пытаюсь понять что такое "ПРОГРАММИРОВАТЬ" , ну а дальше уже буду смотреть по обстоятельствам, что выбрать и на чем остановиться.
Predator пишет:
а для работы с контроллерами гораздо полезнее изучить документацию на контроллер.

Да сейчас изучу основу и буду углубляться в теорию. А документацией микроконтроллера является даташит?
Хотел написать программу, с программной фиксацией тактовой кнопки, но со своими "знаниями" не смог. Погуглил, нашел вариант, в котором выруливают ситуацию при помощи переменной D и ретурна, смысл программы я понял, но когда прокомпилировал код, компилятор выдал вот это предупреждение:

Warning 'return' with no value, in function returning non-void

которое ругается на ретурн, хотя return играет немало важную роль в программе, поэтому хотелось бы устранить ошибку...
Вот кстати сам код
CODE:



#include <avr/io.h>
volatile unsigned char D;

int main(void)
{
DDRC |=(1<<1);
PORTC &=~(1<<1);
DDRB &=~(1<<0);
PORTB |=(1<<0);
while (1)



{
if (PINB & (1<<0))
{
D &=~(1<<1);
}
else
{
if (D & (1<<1))
return;
if (PINC & (1<<1))
{
PORTC &=~(1<<1);
}
else
{
PORTC |=(1<<1);
}
D |=(1<<1);
}
}


}

Может подскажете, что нужно сделать.
54. Predator - 10 Февраля, 2019 - 16:08:52 - перейти к сообщению
вообще return - оператор выхода из функции с возвращением значения. Используется в том случае, когда нужно не только провести какие-то действия, но и передать результат.
попробуйте break; - это вылететь из условия, цикла, функции... на следующую операцию.

в логику программы пока не вникаю, я-бы сделал так:
по нажатии кнопки инвертировал переменную
по состоянию переменной зажигать (тушить) светодиод.
при этом состояние светодиода я-бы не перепроверял (оптимальнее включить включенное, чем проводить проверку).

при испытании в железе вас ждёт сюрприз - дребезг контактов. Я обычно целую отдельную функцию делаю: проверка нажатия-задержка 50 мс-проверка нажатия-возврат кода нажатия (в вашем случае D).
55. Andrey 2004 - 23 Февраля, 2019 - 12:13:10 - перейти к сообщению
Создал программу с копкой и двумя светодиодами, где при нажатии кнопки обы светодиода горят, за тем один гаснет, а другой начинает мигать без остановки.
А как сделать так, чтобы светодиод мигал 5 сек и потом тоже гас, я так и не смог придумать.
Да можно конечно сделать подобным образом:
CODE:
PORTC=0b00000001;
_delay_ms(50);
PORTC=0b00000000;
_delay_ms(50);
PORTC=0b00000001;
_delay_ms(50);
PORTC=0b00000000;
_delay_ms(50);
PORTC=0b00000001;
_delay_ms(50);
PORTC=0b00000000;
_delay_ms(50);
PORTC=0b00000001;
_delay_ms(50);
PORTC=0b00000000;
_delay_ms(50);


Но это как то не совсем правильно...
Есть какой нибудь другой способ, для решения данной задачи???
??
56. Predator - 25 Февраля, 2019 - 10:04:15 - перейти к сообщению
мигание с задержкой в 50мс можно даже не увидеть - будет выглядеть, как слабое свечение.
для многократного повтора есть конструкция, именуемая циклом
в случае, когда точно известно количество повторов:
CODE:

char i;
for (i=0;i<50;i++)
{
PORTC=0b00000001;
_delay_ms(50);
PORTC=0b00000000;
_delay_ms(50);
}

причем переменную i можно использовать (например для плавающей задержки)
CODE:

for (i=0;i<50;i++)
{
PORTC=0b00000001;
_delay_ms(50*i);
PORTC=0b00000000;
_delay_ms(50*i);
}

для случая, когда неизвестно количество повторов используется
CODE:

while(i==0)
{
.....
}

тут главное не попасть в бесконечный цикл.
57. Andrey 2004 - 25 Февраля, 2019 - 22:07:34 - перейти к сообщению
Спасибо за совет, сейчас попробую по вашему методу сделать, а я сделал вот так:
CODE:
while(i < 5)
{
if (N ==0b00000000)//считываем состояние кнопки
{
PORTC=0b00000001;
_delay_ms(50);
PORTC=0b00000000;
_delay_ms(50);
i++;
}
else
{
PORTC=0b00000000;// если кнопка не нажата то напряжение не подаем
}


Вроде тоже правильно...
(Добавление)
Ах да насчет 50 мс у меня почему то 50 мс = 0,5 секунды,
что делать не знаю может посоветуете чего???
Частот МК вроде правильно указана, что делать не знаю.
58. Predator - 26 Февраля, 2019 - 12:32:37 - перейти к сообщению
с точки зрения техники у вас правильно (может даже скомпилируется в тот-же машинный код), а с точки зрения программирования - одна строчка
CODE:
for (i=0;i<50;i++)

собирает в один флакон обнуление i, условие выхода из цикла и инкремент - читать на порядок удобнее.
50 мс превратились в 500 - надо частоту на кварце перепроверить и в дефайне нули тщательнее пересчитать.
59. Andrey 2004 - 27 Февраля, 2019 - 19:11:43 - перейти к сообщению
Predator пишет:
с точки зрения техники у вас правильно (может даже скомпилируется в тот-же машинный код), а с точки зрения программирования - одна строчка

По вашему тоже все работает, буду делать по вашему.
(Добавление)
Сейчас попробую разобраться с частотой.
60. Andrey 2004 - 17 Марта, 2019 - 10:59:22 - перейти к сообщению
Здравствуйте, решил сделать интересную программу:

Есть кнопка и светодиод, светодиод мигает пока не достигнет значения переменной i;
Затем делается большая пауза и светодиод мигает пока опять не достигнет значения переменной i и так до бесконечности;

Значение переменной i мы меняем при помощи кнопки
(пока мне нужно чтобы кол во миганий просто увеличивалось на одну единицу, потом можно будет сделать чтобы значение переменной, при помощи отдельной кнопки, убывало );

Проблема в том что у меня или получается бесконечный цикл (при первом нажатии кнопки цикл замыкается и не реагирует на дальнейшие нажатия);
Или получается сделать все это при помощи For где я действительно могу менять переменную i
,но при этом светодиод мигает до тех пор пока не достигнет значения переменной i а затем гаснет до следующего нажатия кнопки.


Я уже долго бьюсь с этой задачей, но не могу ее полноценно выполнить.
Можете подсказать хотя бы через какие операторы это лучше сделать, или может в C++ есть какие-нибудь другие приемы и решения??