роботы робототехника микроконтроллеры


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

> Без описания
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1249
Дата рег-ции: Июль 2012  



Опыт приходит сразу после того, как был нужен.
Цитата:
потратил ваше время задавая глупые вопросы

да не жалко, на пользу-же пошло.
Повторюсь - если 2004 в вашем нике - год рождения, то большинство вопросов очень закономерные (вы просто не могли этого знать). Я например с 2002 года в контроллерах, и с 1992 года в электронике.
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



Да 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)


ну а все те ошибки которые были в прошлой АВРке ушли.
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1249
Дата рег-ции: Июль 2012  



сравнение ==
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



ДА, все варнинги ушли, спасибо.
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1249
Дата рег-ции: Июль 2012  



немного поясню:
== сравнение, a==b в случае, если a и b равны - возвращает 1, если не равны, возвращает 0.
= присвоение a=b - значит, в ячейку a прописать значение ячейки b, в случае удачной записи возвращает единицу. В варнинге и ругалось, что всегда единица будет.
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



Подскажите пожалуйста где можно изучить теорию программирования на C++ (электронные книги, сайты).
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1249
Дата рег-ции: Июль 2012  



классика:
http://e-maxx.ru/bookz/files/golub_cord.pdf
http://8361.ru/6sem/books/Straustrup-Yazyk_programmirovaniya_c.pdf

но моё мнение таково: если собираешься всю жизнь писать на одном языке и под одной оболочкой - досконально изучай документацию к оболочке и компилятору.
для моей жизни и работы вполне хватает знания основ и, главное, чёткого понимания что я хочу напрограммировать.
Когда возникают проблемы (в моём случае со знаками ^&*~ при применении указателей) просто гуглю. Когда нужно накодить что-то нестандартное - читаю документацию на компилятор.
В общем чем читать книги - лучше много программировать мелких задач, а для работы с контроллерами гораздо полезнее изучить документацию на контроллер.
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



Спасибо за книги, в будующем думаю много интересного из них подчеркну.
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);
}
}


}

Может подскажете, что нужно сделать.
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1249
Дата рег-ции: Июль 2012  



вообще return - оператор выхода из функции с возвращением значения. Используется в том случае, когда нужно не только провести какие-то действия, но и передать результат.
попробуйте break; - это вылететь из условия, цикла, функции... на следующую операцию.

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

при испытании в железе вас ждёт сюрприз - дребезг контактов. Я обычно целую отдельную функцию делаю: проверка нажатия-задержка 50 мс-проверка нажатия-возврат кода нажатия (в вашем случае D).
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



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


Но это как то не совсем правильно...
Есть какой нибудь другой способ, для решения данной задачи???
??
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1249
Дата рег-ции: Июль 2012  



мигание с задержкой в 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)
{
.....
}

тут главное не попасть в бесконечный цикл.
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



Спасибо за совет, сейчас попробую по вашему методу сделать, а я сделал вот так:
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 секунды,
что делать не знаю может посоветуете чего???
Частот МК вроде правильно указана, что делать не знаю.
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1249
Дата рег-ции: Июль 2012  



с точки зрения техники у вас правильно (может даже скомпилируется в тот-же машинный код), а с точки зрения программирования - одна строчка
CODE:
for (i=0;i<50;i++)

собирает в один флакон обнуление i, условие выхода из цикла и инкремент - читать на порядок удобнее.
50 мс превратились в 500 - надо частоту на кварце перепроверить и в дефайне нули тщательнее пересчитать.
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



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

По вашему тоже все работает, буду делать по вашему.
(Добавление)
Сейчас попробую разобраться с частотой.
 
 Top
Andrey 2004 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Дек. 2018  



Здравствуйте, решил сделать интересную программу:

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

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

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


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

(Отредактировано автором: 17 Марта, 2019 - 11:00:09)

 
 Top
Страниц (6): « 1 2 3 [4] 5 6 »
« С чего начать? »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru