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


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

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


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


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



Хорошо. От первых 5-ти избавились.
а если двойным кликом кликнуть - на какие строчки показывает?
 
 Top
Andrey 2004 Post Id



Капитан


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



насколько я понимаю эти проблемы возникли не из за неправильно написанного кода,
а из за того что чего то не хватает самой программе.
Так может это ЧТО ТО скачать где нибудь...
 
 Top
Predator Супермодератор Post Id


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


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



не совсем так, тут скорее дело в том, что код заточен под библиотеки из другого пакета.
 
 Top
Andrey 2004 Post Id



Капитан


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



Я исправил ошибки (там точки стояли где не надо)
например:
Error 1 expected 'Подмигивающий' before numeric constant

while (PIND(.)0==1) {}
точка которая в скобках- лишняя.
(Добавление)
остались вот эти ошибки:
Error 1 lvalue required as left operand of assignment
Error 2 lvalue required as left operand of assignment
ВОТ полный код:
#include <avr/io.h>
//#include <util/delay.h>
//#include <util/math.h>
int main(void)
{
while (1)
{
while (PIND0==1) {}
if (PINB0==1)
{ PORTB0=0; }
else
{ PORTB0=1; }
while (PIND0==0) {}
};
return (0);}


при двойном клике выделяет вот эти строчки:
1){ PORTB0= (вот здесь) 0; }
2){ PORTB0= (вот здесь) 1; }
(Добавление)
Predator пишет:
не совсем так, тут скорее дело в том, что код заточен под библиотеки из другого пакета.

Это же можно исправить или прийдется "мучатся" ?
 
 Top
Predator Супермодератор Post Id


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


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



да, но не всё так просто.
PIND0 это константа равная 0.
попробуйте так:
CODE:

#include <avr/io.h>

int main(void)
{
while (1)
{
while ((PIND & 0x01)==1) {}
if ((PINB & 0x01)==1)
{ PORTB&=0xfe; }
else
{ PORTB|=0x01; }
while ((PIND & 0x01)==0) {}
};
return (0);}


тут вручную выбирается пин из всего порта.
(Добавление)
если взглянуть вглубь файла iom8.h (его подтягивает io.h), то там можно обнаружить сие:
CODE:

/* PORTD */
#define PD7 7
#define PD6 6
#define PD5 5
#define PD4 4
#define PD3 3
#define PD2 2
#define PD1 1
#define PD0 0

/* DDRD */
#define DDD7 7
#define DDD6 6
#define DDD5 5
#define DDD4 4
#define DDD3 3
#define DDD2 2
#define DDD1 1
#define DDD0 0

/* PIND */
#define PIND7 7
#define PIND6 6
#define PIND5 5
#define PIND4 4
#define PIND3 3
#define PIND2 2
#define PIND1 1
#define PIND0 0


это значит, что эти константы жестко прописаны, и ими можно пользоваться.
тоесть бесполезно сравнивать PIND4 с чем-быто нибыло, это константа равна 4.
зато можно творить такие конструкции: PORTD |= (1 << PD4);
а слова PORTB0 - вообще нет.
 
 Top
Andrey 2004 Post Id



Капитан


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



Predator пишет:

это значит, что эти константы жестко прописаны, и ими можно пользоваться.
тоесть бесполезно сравнивать PIND4 с чем-быто нибыло, это константа равна 4.
зато можно творить такие конструкции: PORTD |= (1 << PD4);
а слова PORTB0 - вообще нет.

Понял.
Predator пишет:
да, но не всё так просто.
PIND0 это константа равная 0.
попробуйте так:

Попробовал- ошибок нет...
Протеуса у меня нет, поэтому чуть попозже залью в микроконтроллер, скажу результаты.
 
 Top
Predator Супермодератор Post Id


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


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



так я сразу скажу: не работает.
у вас как минимум порты не определены, кто вход- кто выход (как - рекомендую всё-же прочесть датащит на контроллер), ну и с фьюзами вероятно разобраться надо.
 
 Top
Andrey 2004 Post Id



Капитан


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



а как можно настроить так чтобы диодом была PC6 а кнопкой PD0??
А то чет я в коде не до конца разбираюсь.
Вот например вот эта строка значит что на весь порт D
подается напряжение или только на один отдельную ногу?
PORTB =0x01,ели на отдельную, то на какую именно???
Также не совсем понятна вот эта строка:

PORTB&=0xfe

можете мне ее пояснить.
А вот здесь мы все значения меняем на логическую еденицу??
((PIND & 0x01)==1) {}
Если вам не трудно то поясните пожалуйста ...
(Добавление)
Все поменял как надо вот что получилось:
#include <avr/io.h>

int main(void)
{
while (1)
{
while ((PINC & 0x01)==1) {}
if ((PIND & 0x01)==1)
{ PORTD&=0xfe; }
else
{ PORTD|=0x01; }
while ((PINC & 0x01)==0) {}
};
return (0);}

огромное вам спасибо за то что помогли разобраться...
Однако вопросы указаные выше я так и не понял.
По крайней мере два последних.
Также скоро хочу скоро проделать такую же работу только тактовой кнопкой,
надеюсь на вашу помощь.
 
 Top
Predator Супермодератор Post Id


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


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



PORTB =0x01 - значит, что на PORTB0 - подаётся 1, на остальные 0.
PORTB&=0xfe - значит, что на PORTB0 - подаётся 0, остальные остаются как были.
PORTB|=0x01 - значит, что на PORTB0 - подаётся 1, остальные остаются как были.

& - побитное логическое умножение.
Регистр порта PIND логически умножаем на 0х01 по сути обнуляем все битики, кроме 0-го.
И результат сравниваем с 1.

| - побитное логическое сложение.

PORTB&=0xfe - идентично PORTB= PORTB & 0xfe, тоесть взять регистр PORTB, логически умножить на 0xfe и положить обратно в PORTB.
0xfe - значит, что число в шестнадцатиричном виде, в десятичном это 254, в двоичном 11111110.

с портом С6 разберетесь?
на тему определения кто вход - кто выход, намекну: почитайте про регистры DDRD, DDRB, DDRC - про них одно и тоже написано, только для портов D,B и С.
 
 Top
Andrey 2004 Post Id



Капитан


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



А вот у меня проблема возникла, у меня светодиод изначально горит, а потом гаснет, а мне нужно наоборот.
(Добавление)
а буквы fe в 0хfe что значит??
(Добавление)
правильно ли будет если я напишу вот так :
PORTD=0x10
и что это будет обозначать.
дело в том что я шеснадцатиричную систему исчисления плохо знаю и чаще использую бинарную
ведь по идее они взаимозаминяемые. Ведь так? Если да то почему вы не используете бинарную?
(Добавление)
а понял насчет 0хfe

(Отредактировано автором: 25 Января, 2019 - 17:50:59)

 
 Top
Predator Супермодератор Post Id


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


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



все системы счисления взаимозаменяемые. Я 16-ричную использую потому, что число в 4 раза короче, для 32-битных значений чувствительно. А переводится шестнадцатиричная система в двоичную легко - каждая шестнадцатиричная цифра в 4 двоичных. С десятичными сложнее.

PORTD=0x10 - будет обозначать PORTD=0b00010000 - PORTD4 взвести в 1, остальное сбросить в 0.

светодиод изначально горит, а потом гаснет, а мне нужно наоборот - это зависит еще и от включения. Можно зажигать логическим 0, можно логической 1.
 
 Top
Andrey 2004 Post Id



Капитан


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



((PINC & 0x01)==1) Данная строка ввела меня в заблуждение.
Т.е. мы берем и равняем вот это (PINC & 0x01) к 1.
или же в этом случае знак == имеет другое обозначение?
Так же мне не совсем понятна вот эта часть (PINC & 0x01)
я представляю ее себе так (PINC & 00000001);
как умножать я знаю. однако в тупик меня ставит PINC
Я не понимаю что мы подрозумиваем под PINC;
Т е заранее мы порту C не задавали никаких значений вроде 00000001,
тогда на какое число нам надо умножить 0х01???
Да я знаю что возможно задаю слишком глупые вопросы, но перерыв кучу инфы ч так и не нашел нужную мне. Ламер Ламер .Заранее благодарю
 
 Top
Predator Супермодератор Post Id


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


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



знак == обозначает, что мы сравниваем, а не присваиваем.
Цитата:
я представляю ее себе так (PINC & 00000001);
- да, это идентично.
на всякий случай не путайте логическое побитное умножение с арифметическим.
арифметическое 7*4=28 и логическое 7&4=4.
Цитата:
Я не понимаю что мы подрАзумЕваем под PINC;

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

Цитата:
Да я знаю что возможно задаю слишком глупые вопросы
на то и форум.
а если 2004 - это год рождения, то вопросы вполне себе закономерные.
Здесь недолюбливают тех, кто задаёт вопросы типа "через месяц курсовик сдавать, сделайте мне схему и прошивку"
 
 Top
Andrey 2004 Post Id



Капитан


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



Сегодня написал еще одну программу:

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=00000000;//таким образом мы настраиваем порт D на вход
DDRC=11111111;//так мы настраиваем порт C на выход
LED=00000000;// LED то же самое что и PORTC который при запуске программы гореть не должен
k= 11111111;// таким образом мы к кнопкам подключили подтягивающий резистор.

while(1)

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

if (PIND=11111101)
{LED=11111111;
_delay_ms(D);
LED=00000000;
_delay_ms(D);
}
else
{
LED=00000000;
}


}



В которой компилятор также выдал ошибки:

Error 2 'ceil' was not declared in this scope
Error 3 'fabs' was not declared in this scope
Error 4 'ceil' was not declared in this scope
Error 1 'fabs' was not declared in this scope

если мене[quote=Predator][/quote] память не изменяет, то они же были и в прошлой программе.
Что сделать чтобы они больше не мешали, я готов на любые меры вплоть до переустановки программы. Помимо этих ошибок есть предупреждения двух типов:

Warning 5 large integer implicitly truncated to unsigned type
и
Warning 8 suggest parentheses around assignment used as truth value

ИХ тоже желательно устранить, при двойном клике бросает на вот эти строчки:

Warning5-DDRC=11111111;
Warning8- if (PIND= 11111110)

На комментарии внимание не обращайте я их писал для себя...
Predator пишет:
подрАзумЕваем
Благодарю за исправление, просто я больше технарь. а не гуманитарий.
 
 Top
Predator Супермодератор Post Id


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


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



за ошибки - ceil и fabs применяются в <util/delay.h>
попробуйте двойным кликом на ошибку кликнуть - попадёте в delay.h, там должно быть "инклуднуто" math.h - дальше будем разбираться.

за варнинги - у вас значения типа 01010101 подразумеваются в двоичном виде, но это только вы понимаете. Компилятор такую запись понимает в десятичном виде (один миллион десять тысяч сто один). Для пояснения компилятору двоичного вида надо писать b01010101.

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