Без описания |
Поиск в теме | Версия для печати |
Andrey 2004 |
Отправлено: 07 Февраля, 2019 - 19:19:05
|
Капитан
Сообщений всего: 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)
ну а все те ошибки которые были в прошлой АВРке ушли. |
|
|
Andrey 2004 |
Отправлено: 10 Февраля, 2019 - 14:36:22
|
Капитан
Сообщений всего: 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);
}
}
}
Может подскажете, что нужно сделать. |
|
|
Predator |
Отправлено: 25 Февраля, 2019 - 09:04:15
|
Супермодератор
Сообщений всего: 1307
Дата рег-ции: Июль 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)
{
.....
}
тут главное не попасть в бесконечный цикл. |
|
|
Andrey 2004 |
Отправлено: 17 Марта, 2019 - 09:59:22
|
Капитан
Сообщений всего: 46
Дата рег-ции: Дек. 2018
|
Здравствуйте, решил сделать интересную программу:
Есть кнопка и светодиод, светодиод мигает пока не достигнет значения переменной i;
Затем делается большая пауза и светодиод мигает пока опять не достигнет значения переменной i и так до бесконечности;
Значение переменной i мы меняем при помощи кнопки
(пока мне нужно чтобы кол во миганий просто увеличивалось на одну единицу, потом можно будет сделать чтобы значение переменной, при помощи отдельной кнопки, убывало );
Проблема в том что у меня или получается бесконечный цикл (при первом нажатии кнопки цикл замыкается и не реагирует на дальнейшие нажатия);
Или получается сделать все это при помощи For где я действительно могу менять переменную i
,но при этом светодиод мигает до тех пор пока не достигнет значения переменной i а затем гаснет до следующего нажатия кнопки.
Я уже долго бьюсь с этой задачей, но не могу ее полноценно выполнить.
Можете подсказать хотя бы через какие операторы это лучше сделать, или может в C++ есть какие-нибудь другие приемы и решения??(Отредактировано автором: 17 Марта, 2019 - 10:00:09) |
|
|
|
Поиск в теме | Версия для печати |
Страниц (6): « 1 2 3 [4] 5 6 » |
« С чего начать? » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|