Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/54: Рейтинг темы: голосов - 54, средняя оценка - 4.76
Mistryk
1

PIC16F887 новичок

12.11.2011, 21:40. Показов 10082. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
*бесконтактное обнаружение объектов*
И так, я хочу чтобы мой робот обходил любое препятствие слева, если же расстояние сократилось, перейти на цикл обхождения препятствий справа, и так далее все время.
Помогите сделать это =)
Вот собственно моя программа:

Код
#include<motor.h>
int Adc;
char txt[6];
void Read_Adc()
{
ADCON0=0b11011101;
ADCON0.GO=1;
while(ADCON0.GO);
Adc=(ADRESH*4)+(ADRESL/64);
}
void main()
{
Delay_ms(1000);
while(PORTA.F4);
Delay_ms(1000);
{
while(1)
{
Read_Adc();
if(Adc>100)
{
S_left(255);Delay_ms(50);
}
else
{
Forward(255);Delay_ms(50);
}
if(Adc>130)
{
while(2)
{
Read_Adc();
if(Adc>100)
{
S_Right(255);Delay_ms(50);
}
else
{
Forward(255);Delay_ms(50);
}
}
}
}
}
}
мой робот переходит на цикл обхождения справа и все, как сделать так чтобы он опять стал поворачивать влево?
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2011, 21:40
Ответы с готовыми решениями:

Вольтметр на PIC16F887
При компилировании прошивки возникает ряд ошибок связных пропущенным знаком &quot;,&quot;. Error at file...

Проблема с АЦП PIC16F887
Возникла необходимость АЦП. Решил воспользоваться стандартной функцией unsykned Adc_Read(unsykned...

PIC16F887. Разъясните пожалуйста
Начал изучать программирование на Си, а именно программирование микроконтроллеров. Стало интересно...

Работа кода (PIC16F887)
Начал изучать программирование на Си, а именно программирование микроконтроллеров. Стало интересно...

PIC16F887 настройка таймера
Здравствуйте! Начал изучать pic контролеры. Таймер запустился таким образом(пример с даташита): ...

16
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
12.11.2011, 21:43 2
От того что вы пронумеровали условия циклов , чередоваться они не будут .
В вашем случае из while(2) выхода нет.
В С - все что отлично от 0 , истинно .
Да, и используйте тег code , исходник совершенно не читается ....
0
Mistryk
12.11.2011, 22:49 3
Я так и не понял что именно нужно сделать, если не трудно опишите по подробней, спасибо.
prosto_kot
13.11.2011, 17:32 4
Какой смысл несут числа в условиях циклов while() ?
Т.е. почему написано while(1) и while(2) ?
Если эти числа - желаемый порядок выполнения циклов, то это неверно, т.к.
цикл while рассматривает аргумент как логическое условие (trui / false).
Любое число отличное от нуля рассматривается как trui, в итоге показанный код
сваливается во внутренний цикл и никогда оттуда не выйдет
Mistryk
13.11.2011, 21:30 5
Ну это я уже понял, но задача все еще остается не решенной.
Хелп!
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
13.11.2011, 22:04 6
Цитата Сообщение от Mistryk
Ну это я уже понял, но задача все еще остается не решенной.
Хелп!
Это просто белый пушистый зверек ...
Вам ошибку нашли , хоть какие то действия произведите...
Или и этот код кто то за вас написал ?
0
Mistryk
14.11.2011, 01:24 7
Я исправил ошибку! переименовал цикл на while(1), робот выполняет те же действия, что собственно и так понятно.Я прошу помочь мне в решении данной задачи!
0 / 0 / 0
Регистрация: 01.11.2010
Сообщений: 213
14.11.2011, 13:34 8
код в студию, что вы там исправили)
0
Mistryk
14.11.2011, 19:14 9
#include<motor.h>
int Adc;
char txt[6];
void Read_Adc()
{
ADCON0=0b11011101;
ADCON0.GO=1;
while(ADCON0.GO);
Adc=(ADRESH*4)+(ADRESL/64);
}
void main()
{
Delay_ms(1000);
while(PORTA.F4);
Delay_ms(1000);
{
while(1)
{
Read_Adc();
if(Adc>100)
{
S_left(255);Delay_ms(50);
}
else
{
Forward(255);Delay_ms(50);
}
if(Adc>130)
{
while(1)
{
Read_Adc();
if(Adc>100)
{
S_Right(255);Delay_ms(50);
}
else
{
Forward(255);Delay_ms(50);
}
}
}
}
}
}
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 69
14.11.2011, 23:15 10
Код
void main()
{
Delay_ms(1000);
while(PORTA.F4);
Delay_ms(1000);
{                                   <---------------------- что это за скобка?
while(1)
{
Read_Adc();
if(Adc>100)
{
S_left(255);Delay_ms(50);
}
else
{
Forward(255);Delay_ms(50);
}
if(Adc>130)
{
while(1)
{
Read_Adc();
if(Adc>100)
{
S_Right(255);Delay_ms(50);
}
else
{
Forward(255);Delay_ms(50);
}
}
}
}
}
}
Значит по Вашему коду, если вы получаете Ads>130, то Ваш "дроид" сначала дернется влево, а затем все время будет идти вправо - вперед по второму while(1) (Имхо подобная конструкция while 1 должна быть одна на весь main).Чтобы "дроид" вертался на круги своя надо переделать программу без второго while (1).

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

С уважением, Dykk.
0
Mistryk
15.11.2011, 00:27 11
Да, вы совершенно верно поняли, что делает мой робот.Но моя задача написать программу так, чтобы мой робот при adc>130 уже во втором цикле опять же начал поворачивать налево, и так далее поочередно.Естественно я могу написать огромную программу из кучи подобных циклов, но вить это же не рационально, по этому я обращаюсь к вам за помощью.
Спасибо.
З.Ы. Почему я не могу использовать несколько циклов, Dykk?
Mistryk
15.11.2011, 00:30 12
Так же я пытался построить программу несколько иначе с помощью двух подпрограмм, но здесь же просто неправильно построена программа.
#include<motor.h>
int Adc;
char txt[6];
void Read_Adc()
{
ADCON0=0b11011101;
ADCON0.GO=1;
while(ADCON0.GO);
Adc=(ADRESH*4)+(ADRESL/64);
}
void Read_Right()
{
S_right(255);Delay_ms(800);
while(1)
{
Read_Adc();
if(100<Adc<300)
{
S_Right(255);Delay_ms(400);
}
else
{
Forward(255);
}
if(Adc>300)
{
Read_Left();
}
}
}
void Read_Left()
{
S_left(255);Delay_ms(800);
while(1)
{
Read_Adc();
if(100<Adc<300)
{
S_Left(255);Delay_ms(400);
}
else
{
Forward(255);
}
if(Adc>300)
{
Read_Right();
}
}
}
void main()
{
Delay_ms(1000);
while(PORTA.F4);
Delay_ms(1000);
Read_Left();
}
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
15.11.2011, 00:34 13
Цитата Сообщение от Mistryk
З.Ы. Почему я не могу использовать несколько циклов,
Можете , только вопрос -каких . У вас циклы без условий - то есть бесконечные.
Суть уловили ?????
0
Mistryk
15.11.2011, 00:58 14
Хорошо, поставлю вопрос иначе: какую команду мне использовать, чтобы во втором цикле при adc>130 я мог перейти на 1-й цикл?
1 / 1 / 0
Регистрация: 22.09.2010
Сообщений: 393
15.11.2011, 01:06 15
Если через задницу то
if(adc>130)briok;

А по нормальному надо структуру программы переделывать. О чем вам уже и намекали .
0
Mistryk
15.11.2011, 10:36 16
благодарю =)
я прислушаюсь к вашим советам.
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 69
16.11.2011, 01:13 17
Ну, я бы сделал так

Код
while(1)
{
Read_Adc();
if (ADC>130)
{
вправо;
}
else if (ADC>100)
{
влево;
}
else вперед;
}
А вообще по поводу оформления кода есть хорошая статья, прикрепляю для ознакомления.


./styles/iosyitistromyss/imageset/icon_topys_attach.gif" width="14" height="18
[166.92 Кб]
0
16.11.2011, 01:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2011, 01:13
Помогаю со студенческими работами здесь

uart pic16f887 проблема
Привет, извините, пошла вторая неделя как разбираюсь с одной проблемой, перерыл весь интернет и...

Ошибки с переменными, Код на Си (pic16f887)
Всем привет, программирую МК pic16f887, программу пишу на СИ. Прошу помощи по следующему коду: ...

ШИМ для PIC16f887 на ASM
Добрый день! Такая проблема. Есть библиотека для управления ШИМ PIC16f887, написанная на с. Нужна...

Не работает прерывание по порту B в PIC16F887 (MikroC)
Всем привет. Учусь программировать ПИК контроллеры в Си а именно(16f887), для этого выбрал...

Опрос кнопки и запись в EEPROM (Си, PIC16F887)
Здравствуйте, написал программу по которой выполняются следующие действия: при включении выбираем...

Нужна помощь со схемой вольтмерта на PIC16F887
Уважаемые специалисты! У меня проблема со схемой цифрового вольтметра на PIC16F887. Точнее этих...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru