 |
Форум за електроника Български форум за електроника, ремонти, схеми, документация
|
| Предишната тема :: Следващата тема |
| Автор |
Съобщение |
glizan Опитен потребител

Регистриран на: 02 Мар 2007 Мнения: 113 Местожителство: София
|
Пуснато на: Нед Авг 07, 2011 18:49 Заглавие: |
|
|
Еми горе долу знам как работят циклите. И до колкото си спомням в случая кода, който е вътре в тялото на цъкала ще се изпълнява до като условието в скобите не стане грешно. След това спира. И толкова.
Не се връща горе в началото на програмата.
Пробвах сега както ти каза, цялата програма да я сложа вътре в тялото на цикъла и пак се получава същата работа. След като вътрешният цикъл се извърти и спира. Не излиза от него.. и после пак да почне от началото на програмата.
И да си подавам и "1" и "0" нищо не се случва. Чак като рестартирам процесора заработва.
Снимах с телефона. Качеството е ужасно, но мисля че може и малко по ясно да стане какво искам да направя. http://file.bg/c113437rjQxp _________________ Начинаещ |
|
| Върнете се в началото |
|
 |
nobodyshadow Опитен потребител


Регистриран на: 24 Яну 2004 Мнения: 413 Местожителство: Сливен
|
Пуснато на: Нед Авг 07, 2011 22:54 Заглавие: |
|
|
Би трябвало да работи по този начин.Постни целия код както си сглобил с всичко да видим. _________________ Не мога да знам всичко,а и не искам.Тогава би било прекалено лесно и скучно! |
|
| Върнете се в началото |
|
 |
the_bull Опитен потребител

Регистриран на: 31 Май 2007 Мнения: 660 Местожителство: Монтана(Студент в Русе)
|
Пуснато на: Нед Авг 07, 2011 23:00 Заглавие: |
|
|
Виж да нямаш хардуерен проблем. Ти добре подаваш лог."1", но имаш ли след това pull-down резистор, който да свали нивото от 1 в 0. И също така по добре работи с обратна логика. По шумоустойчиво е да държиш пина във високо ниво и когато искаш да се върти да му задаваш (съответно четеш) ниско ниво. Също така дай сорса да видим какво си направил за да може да ти помогнем защото само 1 скоба да си сложил където не трябва и чакай да заработи. _________________ Постулат на Хорнер за петте удара:
"Опитът е право пропорционален на потрошеното оборудване." |
|
| Върнете се в началото |
|
 |
glizan Опитен потребител

Регистриран на: 02 Мар 2007 Мнения: 113 Местожителство: София
|
Пуснато на: Пон Авг 08, 2011 0:39 Заглавие: |
|
|
Да, на всеки пин имам резистор.
Не съм сигурен, че кога ще ви помогне особено. Така като го гледа и на мен ми се струва, че работи
Нещата са доста по-сложни... цялата програма е дълга и оплетена. Използвам десетина входа и изхода от платката.
Аз вече се прежалих с това... Просто поставих ръчно едно фиксирано изчакване от 5000ms при което сервото стои в изходна позиция. През това време външното влияние, което IF функцията проверява( "1" на пин 1) вече ще е отминало, тоест няма да има 1-ца.
Пък и да не е, просто това в IF ще се повтори още един път (което за мен не е катастрофален проблем).
Това е една малка част от цялото нещо, което правя. Първоначално си мислих, че това, което искам да направя е супер просто, но проблема е че в една програма искам да направя много различни неща всяко от които да си работи самостоятелно и да не пречи на другото. И се оказа, че не е толкова просто. Днеска цял ден писах и направих всичко без това, което описвам в тази тема.
Иначе ето тази част със циклите
| Код: | #include <Servo.h>
Servo servo;
int promenliva=0;
int sensor=8; //na pin 8 postavqam butona
void setup()
{
servo.attach(3); // na pin 3 postavqm servoto
pinMode(sensor, INPUT); //definiram pin 8 kato input
}
void loop()
{
while(1)
{
promenliva=digitalRead(sensor); //na promenliva prisvoqvam stoinostta prochetena ot pin 8
servo.write(100);
if(promenliva==HIGH)
{
servo.write(130);
delay(1000);
while(promenliva==HIGH)
{
servo.write(100);
}
}
}
} |
Този код съм го променял 100 пъти сигурно. Пробвал съм и с do/while.. и какво ли още не... когато цикъла се извърти нещата спират и излизане от него няма.
Все пак ако някой ми каже как да броя времето от даден ред в програмата и после това време да го използвам няколко реда по на долу мисля че ще си направя нещата. Все пак това беше и заглавието на темата ми. _________________ Начинаещ |
|
| Върнете се в началото |
|
 |
AA Опитен потребител

Регистриран на: 28 Юни 2004 Мнения: 730 Местожителство: ВеликоТърново
|
Пуснато на: Пон Авг 08, 2011 10:10 Заглавие: |
|
|
Твърде вероятно е да не съм се ориентирал правилно , но ще напиша малко по темата - може и да е от полза. В пост номер 7 е описана една процедура от 4 точки - за да се изпълни тази процедура както е описана няма нужда от брояч , таймер или днещо друго подобно. Не става ясно въпросния таймер кое време трябва да отчете. Ако трябва да се отчете времето от първото постъпване на ниво HIGH ( описано в т.1) до следващото (описано в т.4) и това време да се ползува за нещо друго възникват нови въпроси - с каква точност трябва да се отчете това време , в какъв диапазон се очаква да е , какви други паралелни процеси текат в системата и те трябва ли да се отчитат? Вероятно трябва да си организираш собствен брояч който да се впише по подходящ начин в другите цикли и който да нулираш след като свалиш от него необходимата информация за да бъде той готов за ново запускане в необходимия момент.
Надявам се да не съм писал големи безсмислици. |
|
| Върнете се в началото |
|
 |
glizan Опитен потребител

Регистриран на: 02 Мар 2007 Мнения: 113 Местожителство: София
|
Пуснато на: Пон Авг 08, 2011 10:36 Заглавие: |
|
|
Саега ще обясня защо искам този брояч и защо си мисля, че с него ще стане.
| Код: | #include <Servo.h>
Servo servo;
int promenliva=0;
int sensor=8; //na pin 8 postavqam butona
void setup()
{
servo.attach(9); // na pin 9 postavqm servoto
pinMode(sensor, INPUT); //definiram pin 8 kato input
}
void loop()
{
promenliva=digitalRead(sensor); //na promenliva prisvoqvam stoinostta prochetena ot pin 8
servo.write(100); //servoto e zavartqno na "100"
if(promenliva==HIGH) //ako butona se natisne (na pin 8 ima HIGH)
{
ПУСКАМ БРОЯЧ //toj zapochva da broi v ms.
servo.write(130); //servo se zawyrta "130"
delay(1000); // v prodylvenie na 1 sek
servo.write(100); //sled tova se vryshta otnovo na "100"
delay(ПОСТАВЯМ ВРЕМЕТО ОТ БРОЯЧА)
// kolko vreme trqbva da stoi tuk? Emi do kogato butona e natisnat. Kolko e tova vreme? Emi tolkova kolkoto broqcha e prebroil. A ne za vek i vekov kakto se poluchava pri while cikala.
}
} |
Има логика в това което казавам и си мисля че ще стане. _________________ Начинаещ |
|
| Върнете се в началото |
|
 |
nobodyshadow Опитен потребител


Регистриран на: 24 Яну 2004 Мнения: 413 Местожителство: Сливен
|
Пуснато на: Пон Авг 08, 2011 17:21 Заглавие: |
|
|
Отначало беше написал,че няма да тръгваш да обясняваш подробно защо и какво....И ето,че ще захванем 3-та страница с писане като всеки път се появява нещо ново и така...Аз от къде можех да знам,че ползваш още 10 входа и изхода и незнам си какво още.Примера който ти написах не е приложим в този случай.Защото ти зацикля програмата и не върши нищо друго.Когато имаш да вършиш няколко задачи,който трябва да се изпълняват независимо една от друга в времето се използват прекъсвания.Обаче изобщо не ми е ясно как трябва да стане на това ардуино...Погледнах някакви примери-те за всякаква операция си имат библиотека или функция (примерно управление на серво машинка,мигане на светодиод и т.н.) и ти трябва просто да си заместиш с някакви твои стойности.Ама като нямаш на готово дадено и блокираш...Според мен човек начинаещ трудно ще се научи да направи нещо негово по този начин.Просто правиш примерите които видиш....
Явно тук никой не се е занимавал с ардуино и трудно ще намериш помощ.Питай ако не си в форума за роботика или в някой чужд форум специализиран в ардуино със сигурност има... _________________ Не мога да знам всичко,а и не искам.Тогава би било прекалено лесно и скучно! |
|
| Върнете се в началото |
|
 |
AA Опитен потребител

Регистриран на: 28 Юни 2004 Мнения: 730 Местожителство: ВеликоТърново
|
Пуснато на: Пон Авг 08, 2011 21:45 Заглавие: |
|
|
Ако се погледне горния код може да се направят следните разсъждения - при подаването на сигнал на входа сензор се стартира брояч за отчитане на времето , изпълняват се командите
servo.write(130); //servo se zawyrta "130"
delay(1000); // v prodylvenie na 1 sek
servo.write(100); //sled tova se vryshta otnovo na "100"
След това се отчита брояча и стойността му се ползува като параметър на delay. Не е много ясен момента на отчитане на брояча но така както е даден кода , между старта и стопа се изпълняват три команди, така че отчетеното време би трябвало да е равно на сумата от времената , за които се изпълняват трите команди - мисля че това време е точно определено и няма нужда от брояч.
Тъй като горния код вероятно е доста примерен и сигурно не е реален мога да дам следното принципно предложение , което никога не съм пробвал на практика - отчитат се стойностите на функцията millis в двата момента , които ни интересуват , изваждаме ги и получаваме времето , което ни интересува.
От всичко писано по-горе така и не ми стана ясна идеята защо конкретно е необходим такъв брояч , но питащия евентуално може да изясни нещата с по прости думи.
Това обяснение - // kolko vreme trqbva da stoi tuk? Emi do kogato butona e natisnat. Kolko e tova vreme? Emi tolkova kolkoto broqcha e prebroil. - аз поне не го разбрах много. Това , че не съм го разбрал разбира се не означава почти нищо.
До тук беше писао снощи а това е от сутринта след като разгледах клипа.Мисля , че за това което искаш не ти трябва таймер. След като сервомашинката се завърти и се върне си ссложи грубо казано една метка в програмата , че процеса е минал - дай стойност на една променлива примерно единица. В процеса на програмата проверявай входа от сензора и метката.Докато на сензора има сигнал а метката е активна сервомашинката да не прави нищо.Като отпадне сигнала от сензора смени и стойността на метката. Когато пак постъпи сигнал на сензора и метката е неактивна сервомашинката да направи каквото трябва и така нататък. Мисля че за работа по такава логика няма място за таймери и подобни.Предполагам,че код работещ по тоя начин няма да е проблем да напишеш. Как вече ще го впишеш коректно в останалата част от програмата е друг въпрос. Коректното съчетаване на паралелно работещи процеси при тази пратформа поне по моя малък опит е деликатна работа.А вероятно и не само при тази платформа. |
|
| Върнете се в началото |
|
 |
|
|
Не Можете да пускате нови теми Не Можете да отговаряте на темите Не Можете да променяте съобщенията си Не Можете да изтривате съобщенията си Не Можете да гласувате в анкети
|
|